<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=31.41.59.210</id>
	<title>wiki12 - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=31.41.59.210"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/31.41.59.210"/>
	<updated>2026-07-17T02:14:25Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=Object_Pascal&amp;diff=1479</id>
		<title>Object Pascal</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=Object_Pascal&amp;diff=1479"/>
		<updated>2026-03-22T08:39:55Z</updated>

		<summary type="html">&lt;p&gt;31.41.59.210: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка языка программирования&lt;br /&gt;
 |class                  = [[Компилятор|компилируемый]]&lt;br /&gt;
 |typing                 = [[Статическая типизация|статическая]], [[динамическая типизация|динамическая]] (array of const, [[RTTI]], Variant), [[Строгая типизация|строгая]]&lt;br /&gt;
 |implementations        = [[Delphi (язык программирования)|Delphi]] ([[x86]] and [[Common Language Infrastructure|CLI]]), [[Oxygene (язык программирования)|Oxygene]] ([[Common Language Infrastructure|CLI]]), [[Free Pascal]] ([[x86]], [[x86-64]], [[PowerPC]], [[ppc64]], [[SPARC]] and [[ARM (архитектура)|ARM]]), [[Virtual Pascal]] ([[x86]]), [[TMT Pascal]] ([[x86]]), Turbo51 ([[Intel 8051]])&lt;br /&gt;
 |dialects               = Apple, [[Turbo Pascal]], objfpc, [[Delphi (язык программирования)|Delphi]], Delphi.NET, [[Oxygene (язык программирования)|Oxygene]]&lt;br /&gt;
 |influenced             = [[C Sharp|C#]], [[Java]], [[Nim]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Object Pascal&#039;&#039;&#039; ({{tr-en|Объектный Паскаль}}) — [[язык программирования]], разработанный в фирме [[Apple Computer]] в [[1986 год]]у группой [[Ларри Теслер]]а, который консультировался с [[Никлаус Вирт|Никлаусом Виртом]]&amp;lt;ref&amp;gt;{{cite journal |last1=Tesler |first1=Larry |title=Object Pascal Report |journal=Structured Language World |date=1985 |volume=9 |issue=3 |pages=10–7}}&amp;lt;/ref&amp;gt;. Произошёл от более ранней объектно-ориентированной версии [[Паскаль (язык программирования)|Паскаль]]&amp;lt;ref&amp;gt;Буч Г. Объектно-ориентированное проектирование с примерами применения К.: Диалектика; М.: Конкорд, 1992. — 519 с.&amp;lt;/ref&amp;gt;, называвшейся [[Clascal]], который был доступен на компьютере [[Apple Lisa]].&lt;br /&gt;
&lt;br /&gt;
== Изменения в Object Pascal от [[Borland]] в сравнении с [[Turbo Pascal]] ==&lt;br /&gt;
Изменения коснулись групп целых, символьных и строковых типов, которые стали разделяться на две категории:&lt;br /&gt;
* &#039;&#039;&#039;Фундаментальные (fundamental) типы&#039;&#039;&#039;. Их представление в памяти (число битов и наличие знака) строго фиксируется и выдерживается неизменным во всех последующих реализациях Object Pascal для любых операционных систем и компьютерных платформ.&lt;br /&gt;
* &#039;&#039;&#039;Родовые (generic) типы&#039;&#039;&#039;. Их представление в памяти не фиксируется и будет реализовано оптимальным способом, в зависимости от реализации для конкретной операционной системы и компьютерной платформы.&lt;br /&gt;
&lt;br /&gt;
=== Интерфейсы ===&lt;br /&gt;
См. [[Интерфейс (ООП)#Delphi|Интерфейсы: Delphi]]&lt;br /&gt;
&lt;br /&gt;
=== Перегрузка процедур и функций (не ООП) ===&lt;br /&gt;
Введена перегрузка процедур и функций, не являющихся членами объекта или класса. Перегружаются (с помощью ключевого слова &#039;&#039;&#039;overload&#039;&#039;&#039;) различающиеся типами и числом параметров процедуры и функции:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
procedure Calc(I: Integer); overload;&lt;br /&gt;
// ...&lt;br /&gt;
procedure Calc(S: String; J: Integer); overload;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Динамический массив ===&lt;br /&gt;
Введён для устранения рутинных операций выделения и возвращения памяти в heap-область (кучу), и для того, чтобы избежать случайных ошибок и утечки памяти. Элементы массива должны быть одинаковыми по типу. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
Пример объявления:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var MyFlexibleArray: array of Real;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  A, B: array of Integer;&lt;br /&gt;
begin&lt;br /&gt;
  SetLength(A, 1); //Выделяем память под один элемент&lt;br /&gt;
  A[0] := 1;   B := A;&lt;br /&gt;
  B[0] := 2;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Начиная с Delphi XE7 стали возможны следующие действия с динамическими массивами:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var M: array of integer;&lt;br /&gt;
begin&lt;br /&gt;
  M := [1, 2, 3, 4, 5];&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
 M := M + [5, 6, 7];&lt;br /&gt;
 Insert([6, 7, 8], M, 5); // вставка массива [6, 7, 8], в M, начиная с индекса 5&lt;br /&gt;
 Delete(M, 1, 3); // удаляем 3 элемента, начиная с индекса 1&lt;br /&gt;
 Concat([1, 2, 3, 4], [5, 6, 7])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
То есть с динамическими массивами можно работать так же, как со строками.&lt;br /&gt;
&lt;br /&gt;
В динамическом массиве также возможно задание открытого массива параметров, но тип их должен быть объявлен ранее, например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type TDynamicCharArray = array of Char;&lt;br /&gt;
function Find(A: TDynamicCharArray): Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Динамическая типизация ===&lt;br /&gt;
&lt;br /&gt;
==== Операторы динамической проверки и приведения типов ====&lt;br /&gt;
В языке Object Pascal фирмы [[Borland]] появилась [[динамическая типизация]], а также оператор динамического приведения типов &#039;&#039;&#039;as&#039;&#039;&#039; и оператор &#039;&#039;&#039;is&#039;&#039;&#039; для динамической проверки типов. Также в открытом массиве параметров стала возможна передача параметров различного типа (variant open array parameters).&lt;br /&gt;
&lt;br /&gt;
==== Вариантный тип ====&lt;br /&gt;
В языке Object Pascal был введён вариантный тип данных (&#039;&#039;&#039;Variant&#039;&#039;&#039;), тип которых не известен на этапе компиляции и может изменяться на этапе выполнения программы.&lt;br /&gt;
Однако этот тип данных поглощает больше памяти по сравнению с соответствующими переменными и операции над данными типа Variant выполняются медленнее.&lt;br /&gt;
Более того, недопустимые операции над данными этого типа чаще приводят к ошибкам на этапе выполнения программы, в то время как подобные ошибки над данными другого типа были бы выявлены ещё на этапе компиляции.&lt;br /&gt;
&lt;br /&gt;
Вариантные переменные могут принимать различные значения (целые, строковые, булевские, &#039;&#039;&#039;Currency&#039;&#039;&#039;, OLE-строки), быть массивами элементов этих же типов и массивом значений вариантного типа, а также содержать COM и CORBA объекты, чьи методы и свойства могут быть доступны посредством этого типа.&lt;br /&gt;
Однако Variant не может содержать:&lt;br /&gt;
* данные структурных типов;&lt;br /&gt;
* указатели;&lt;br /&gt;
* Int64 (начиная с Delphi 6 — может).&lt;br /&gt;
&lt;br /&gt;
Variant можно смешивать (в выражениях и операторах) с другими вариантами, числовыми, строковыми и булевскими данными. При этом компилятор автоматически выполняет преобразование типа. Варианты, содержащие строки, не могут, однако, индексироваться (V[i] недопустимо).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  V1, V2, V3, V4, V5: Variant;&lt;br /&gt;
  I: Integer;&lt;br /&gt;
  D: Double;&lt;br /&gt;
  S: String;&lt;br /&gt;
begin&lt;br /&gt;
  V1 := 1; //значение типа integer&lt;br /&gt;
  V2 := 359.768; //значение типа real&lt;br /&gt;
  V3 := &#039;Hello world!&#039;; //значение типа string&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Параметры типа вариантного открытого массива ====&lt;br /&gt;
Стала возможна передача параметров различного типа.&lt;br /&gt;
В оригинале он назван как «variant open array parameters». Тип данных определяется динамически в процессе выполнения программы. Так же как и в обычном открытом массиве функция High вызывается для определения числа элементов массива. Для объявления используются ключевые слова &#039;&#039;&#039;array of const&#039;&#039;&#039;. Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
function Output(const Args: array of const): string;&lt;br /&gt;
var&lt;br /&gt;
  I: Integer;&lt;br /&gt;
begin&lt;br /&gt;
  Result := &#039;&#039;;&lt;br /&gt;
  for I := 0 to High(Args) do with Args[I] do&lt;br /&gt;
    case VType of&lt;br /&gt;
      vtString:     Result := Result + VString^;&lt;br /&gt;
      vtPChar:      Result := Result + VPChar;&lt;br /&gt;
      vtInteger:    Result := Result + IntToStr(VInteger);&lt;br /&gt;
      vtBoolean:    Result := Result + BoolToStr(VBoolean);&lt;br /&gt;
      vtChar:       Result := Result + VChar;&lt;br /&gt;
      vtExtended:   Result := Result + FloatToStr(VExtended^);&lt;br /&gt;
      vtObject:     Result := Result + VObject.ClassName;&lt;br /&gt;
      vtClass:      Result := Result + VClass.ClassName;&lt;br /&gt;
      vtVariant:    Result := Result + string(VVariant^);&lt;br /&gt;
      vtInt64:      Result := Result + IntToStr(VInt64^);&lt;br /&gt;
      vtAnsiString: Result := Result + string(VAnsiString);&lt;br /&gt;
      vtCurrency:   Result := Result + CurrToStr(VCurrency^);&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
  Result := Result + &#039; &#039;;&lt;br /&gt;
end;&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
Output([&#039;test&#039;, 777, &#039;@&#039;, True, 3.14159, TForm]); //передача открытого массива параметров&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будет возвращена строка «test 777 @ T 3.14159 TForm».&lt;br /&gt;
&lt;br /&gt;
Как видно, имеет свою внутреннюю структуру, обращение к которой даёт возможность определить тип данных. В строке вызова функции создаётся массив, с помощью &#039;&#039;конструктора открытого массива&#039;&#039;, который использует квадратные скобки.&lt;br /&gt;
&lt;br /&gt;
=== Различия в объектных моделях ===&lt;br /&gt;
Для введения новой объектной модели введено ключевое слово &#039;&#039;&#039;class&#039;&#039;&#039; (в [[Turbo Pascal]] ключевое слово &#039;&#039;&#039;object&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Введены операторы для проверки и приведения классов &#039;&#039;&#039;is&#039;&#039;&#039; и &#039;&#039;&#039;as&#039;&#039;&#039; динамически в ходе выполнения программы.&lt;br /&gt;
Появились указатели на методы, для чего введено новое использование ключевого слова &#039;&#039;&#039;object&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TMyMethod = procedure (Sender : Object) of object;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Изменения синтаксиса из-за изменения размещения объектов ====&lt;br /&gt;
В Turbo Pascal можно было работать как с динамическими, так и со статическими экземплярами объектов.&lt;br /&gt;
&lt;br /&gt;
В объектной модели Object Pascal программист работает только с динамическими экземплярами классов, выделяемых в heap-области (куче). В связи с этим изменён синтаксис обращения к полям и методам объектов.&lt;br /&gt;
&lt;br /&gt;
Ранее для работы с динамическими экземплярами объектов, инициализированными с использованием обращения к конструктору в сочетании с функцией &#039;&#039;&#039;New&#039;&#039;&#039;, необходимо было использовать обращение по [[Указатель (тип данных)|указателю]] (^). Теперь тип класса стал являться по умолчанию также указателем.&lt;br /&gt;
&lt;br /&gt;
Пример для сравнения:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объектная модель в Turbo Pascal&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  PMyObject = ^TMyObject;&lt;br /&gt;
  TMyObject = object (TObject)&lt;br /&gt;
    MyField : PMyType;&lt;br /&gt;
    constructor Init;&lt;br /&gt;
  end;&lt;br /&gt;
//...&lt;br /&gt;
var&lt;br /&gt;
  MyObject : PMyObject;&lt;br /&gt;
begin&lt;br /&gt;
  MyObject := New(PMyObject,Init);&lt;br /&gt;
  MyObject^.MyField := //...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Новая объектная модель в Object Pascal&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TMyObject = class (TObject)&lt;br /&gt;
    MyField : TMyType;&lt;br /&gt;
    constructor Create;&lt;br /&gt;
  end;&lt;br /&gt;
//...&lt;br /&gt;
var&lt;br /&gt;
  MyObject : TMyObject;&lt;br /&gt;
begin&lt;br /&gt;
  MyObject := TMyObject.Create;&lt;br /&gt;
  MyObject.MyField := //...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Было изменено соглашение об именовании конструкторов и деструкторов. В старой объектной модели вызов &#039;&#039;&#039;New&#039;&#039;&#039; отвечал за распределение памяти, а обращение к конструктору инициализировало выделенную область памяти. В новой модели эти действия выполняет конструктор &#039;&#039;&#039;Create&#039;&#039;&#039;. Начиная с версии Delphi XE появились статические методы класса.&amp;lt;ref&amp;gt;[http://www.interface.ru/iarticle/files/25458_53867033.pdf Преимущества перехода на Delphi XE Что нового по сравнению с Delphi 7 Андреано Лануш (Andreano Lanusse)] {{Wayback|url=http://www.interface.ru/iarticle/files/25458_53867033.pdf |date=20160615174245 }},Ноябрь 2010 г. Embarcadero Technologies Россия, СНГ&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Появилась возможность ограничивать видимость членов класса (методы, свойства), которые предназначены для использования только в реализации производных классов. Это даёт возможность защищать исходный код от модификации пользователями класса. Такие методы содержатся в секции &#039;&#039;&#039;protected&#039;&#039;&#039; (защищённые) в объявлении класса.&lt;br /&gt;
&lt;br /&gt;
==== Визуальное объектно-ориентированное программирование ====&lt;br /&gt;
Появились понятия свойства (&#039;&#039;&#039;property&#039;&#039;&#039;) и связанные со свойствами ключевые слова &#039;&#039;&#039;read&#039;&#039;&#039;, &#039;&#039;&#039;write&#039;&#039;&#039;, &#039;&#039;&#039;stored&#039;&#039;&#039;, &#039;&#039;&#039;default&#039;&#039;&#039; (&#039;&#039;&#039;nodefault&#039;&#039;&#039;), &#039;&#039;&#039;index&#039;&#039;&#039;. Свойства визуальных объектов, видимых в [[Интегрированная среда разработки|интегрированной среде разработки]], объявляются с помощью нового слова &#039;&#039;&#039;published&#039;&#039;&#039; в качестве секции в объявлении класса, являющегося визуальным объектом.&lt;br /&gt;
&lt;br /&gt;
=== [[Обобщённое программирование|Обобщения]] ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  {объявление}&lt;br /&gt;
  generic TList&amp;lt;T&amp;gt; = class&lt;br /&gt;
    Items: array of T;&lt;br /&gt;
    procedure Add(Value: T);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
  {реализация}&lt;br /&gt;
  procedure TList.Add(Value: T);&lt;br /&gt;
  begin&lt;br /&gt;
    SetLength(Items, Length(Items) + 1);&lt;br /&gt;
    Items[Length(Items) - 1] := Value;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общий класс может быть просто специализирован для конкретного типа с использованием ключевого слова &#039;&#039;&#039;specialize&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TIntegerList = specialize TList&amp;lt;Integer&amp;gt;;&lt;br /&gt;
  TPointerList = specialize TList&amp;lt;Pointer&amp;gt;;&lt;br /&gt;
  TStringList  = specialize TList&amp;lt;string&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Перегрузка операторов]] ===&lt;br /&gt;
Разработчики [[TMT Pascal]] (модификация Object Pascal) первыми ввели полноценную [[перегрузка операторов|перегрузку операторов]], что впоследствии было перенято разработчиками других диалектов языка: Delphi (с Delphi 2005), [[Free Pascal]] и др.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
{объявление}&lt;br /&gt;
type&lt;br /&gt;
  TVector = packed record&lt;br /&gt;
    A, B, C: Double;&lt;br /&gt;
    procedure From(const A, B, C: Double);&lt;br /&gt;
    class operator Add(const Left, Right: TVector): TVector;&lt;br /&gt;
    class operator Implicit(const v: TVector): TPoint;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
{реализация}&lt;br /&gt;
implementation&lt;br /&gt;
//...&lt;br /&gt;
  class operator TVector.Add(const Left, Right: TVector): TVector;&lt;br /&gt;
  begin&lt;br /&gt;
    Result.A := Left.A + Right.A;&lt;br /&gt;
    Result.B := Left.B + Right.B;&lt;br /&gt;
    Result.C := Left.C + Right.C;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  class operator TVector.Implicit(const v: TVector): TPoint;&lt;br /&gt;
  begin&lt;br /&gt;
    Result.A := round(v.A);&lt;br /&gt;
    Result.B := round(v.B);&lt;br /&gt;
  end;&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
{использование}&lt;br /&gt;
var&lt;br /&gt;
  v1, v2: TVector;&lt;br /&gt;
begin&lt;br /&gt;
  v1.From(20, 70, 0);&lt;br /&gt;
  v2.From(15, 40, 4);&lt;br /&gt;
  Canvas.Polygon([v1, v2, v1 + v2]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Поддержка различными разработчиками ==&lt;br /&gt;
Начиная с версии среды Delphi 7 фирма [[Borland]] стала официально называть язык Object Pascal как [[Delphi (язык программирования)|Delphi]]&amp;lt;ref&amp;gt;[http://docs.codegear.com/docs/radstudio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devcommon/overview_xml.html Delphi Language Overview]{{Недоступная ссылка|date=2018-01|bot=InternetArchiveBot }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Язык Object Pascal поддерживается и развивается другими разработчиками. Наиболее серьёзные реализации Object Pascal (помимо Delphi) — это кроссплатформенный [[TopSpeed Pascal]] (версия языка Turbo Pascal&amp;lt;ref&amp;gt;[http://www.nf-team.org/drmad/stuff/t.htm TopSpeed-компиляторы: не дожили до триумфа] {{webarchive|url=https://web.archive.org/web/20120111161303/http://www.nf-team.org/drmad/stuff/t.htm |date=2012-01-11 }}&amp;lt;/ref&amp;gt;) мультиязыковой среды [[JPI#TopSpeed JPI|TopSpeed]], [[TMT Pascal]], [[Virtual Pascal]], [[PascalABC.NET]], [[Free Pascal]], [[GNU Pascal]]. Язык программирования [[Oxygene (язык программирования)|Oxygene]] является диалектом Object Pascal для платформы .NET и дальнейшим его развитием, а новыми возможностями языка является оператор &amp;quot;:&amp;quot;, асинхронный и отложенный вызовы методов, асинхронное выполнение блока кода, параллельные циклы, анонимные конструкторы, элементы контрактного и аспектно-ориентированного программирования и др.&amp;lt;ref&amp;gt;{{Cite web |url=https://codmasters.ru/thread-33-1-1.html |title=Remobjects Oxygene |access-date=2015-11-16 |archive-url=https://web.archive.org/web/20151117021059/https://codmasters.ru/thread-33-1-1.html |archive-date=2015-11-17 |url-status=dead }}&amp;lt;/ref&amp;gt; (компилятор распространяется без ограничений).&lt;br /&gt;
&lt;br /&gt;
== Примеры «[[Hello, world!]]» в различных объектных расширениях языка ==&lt;br /&gt;
{{Начало скрытого блока|Заголовок=Object Pascal от Apple}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
program ObjectPascalExample;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
  THelloWorld = object&lt;br /&gt;
    procedure Put;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  HelloWorld: THelloWorld;&lt;br /&gt;
&lt;br /&gt;
procedure THelloWorld.Put;&lt;br /&gt;
begin&lt;br /&gt;
  WriteLn(&#039;Hello, World!&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  New(HelloWorld);&lt;br /&gt;
  HelloWorld.Put;&lt;br /&gt;
  Dispose(HelloWorld);&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Конец скрытого блока}}&lt;br /&gt;
&lt;br /&gt;
{{Начало скрытого блока|Заголовок=Turbo Pascal}}&lt;br /&gt;
Delphi (для обеспечения обратной совместимости) и [[Free Pascal]] также поддерживают этот вариант синтаксиса.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
program ObjectPascalExample;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
  PHelloWorld = ^THelloWorld;&lt;br /&gt;
  THelloWorld = object&lt;br /&gt;
    procedure Put;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  HelloWorld: PHelloWorld; { это указатель на THelloWorld }&lt;br /&gt;
&lt;br /&gt;
procedure THelloWorld.Put;&lt;br /&gt;
begin&lt;br /&gt;
  WriteLn(&#039;Hello, World!&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
   New(HelloWorld);&lt;br /&gt;
   HelloWorld^.Put;&lt;br /&gt;
   Dispose(HelloWorld);&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Конец скрытого блока}}&lt;br /&gt;
{{Начало скрытого блока|Заголовок=Delphi и Free Pascal}}&lt;br /&gt;
В Free Pascal этот вариант синтаксиса доступен в режимах &#039;&#039;&#039;ObjFpc&#039;&#039;&#039; и &#039;&#039;&#039;Delphi&#039;&#039;&#039;.&amp;lt;ref&amp;gt;{{cite web|url=http://www.freepascal.org/docs-html/ref/refch6.html#x66-760006|title=Chapter 6: Classes|author=Michaël Van Canneyt|date=2011-12|work=Free Pascal : Reference guide.|lang=en|access-date=2012-01-16|archive-url=https://www.webcitation.org/659qF0xXI?url=http://www.freepascal.org/docs-html/ref/refch6.html#x66-760006|archive-date=2012-02-02|url-status=dead}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
program ObjectPascalExample;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
  THelloWorld = class                    { определение класса }&lt;br /&gt;
    procedure Put;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
procedure THelloWorld.Put;               { описание процедуры метода Put класса THelloWorld }&lt;br /&gt;
begin&lt;br /&gt;
  Writeln(&#039;Hello, World!&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  HelloWorld: THelloWorld;               { определение переменной-указателя на экземпляр класса }&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  HelloWorld := THelloWorld.Create;      { конструктор возвращает значение указателя на экземпляр класса }&lt;br /&gt;
  HelloWorld.Put;&lt;br /&gt;
  HelloWorld.Free;                       { деструктор уничтожает экземпляр класса и освобождает область памяти }&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Конец скрытого блока}}&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
{{Pascal}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Object Pascal]]&lt;/div&gt;</summary>
		<author><name>31.41.59.210</name></author>
	</entry>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9F%D0%B0%D1%81%D0%BA%D0%B0%D0%BB%D1%8C_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)&amp;diff=2913</id>
		<title>Паскаль (язык программирования)</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9F%D0%B0%D1%81%D0%BA%D0%B0%D0%BB%D1%8C_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)&amp;diff=2913"/>
		<updated>2026-03-22T08:38:14Z</updated>

		<summary type="html">&lt;p&gt;31.41.59.210: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{другие значения|Паскаль (значения)}}&lt;br /&gt;
{{Карточка языка программирования&lt;br /&gt;
| name = Паскаль&lt;br /&gt;
| logo = &lt;br /&gt;
| paradigm = [[Императивное программирование|императивный]], [[Структурное программирование|структурированный]]&lt;br /&gt;
| class = [[Компилятор|компилируемый]]&lt;br /&gt;
| typing = [[статическая типизация|статическая]], [[сильная типизация|сильная]], [[Типобезопасность|безопасная]] &amp;lt;ref&amp;gt;{{Книга|автор = Kim B. Bruce|год = 2002-01-01|isbn = 9780262025232|страниц = 416|издательство = MIT Press|заглавие = Foundations of Object-oriented Languages: Types and Semantics|ссылка = https://books.google.com/books?id=9NGWq3K1RwUC|страницы = 9|archive-date = 2016-06-18|archive-url = https://web.archive.org/web/20160618062032/https://books.google.com/books?id=9NGWq3K1RwUC}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
| implementations = [[CDC 6000]], [[ICT 1900]], [[Pascal-P]], [[PDP-11]], [[PDP-10]], [[IBM System/370]], [[Hewlett-Packard|HP]], [[Free Pascal]], [[GNU Pascal|GNU]], [[PascalABC.NET]]&lt;br /&gt;
| dialects = [[UCSD Pascal|UCSD]], [[Turbo Pascal|Turbo]], [[Delphi (язык программирования)|Delphi]]&lt;br /&gt;
| year = [[1970]]&lt;br /&gt;
| designer = [[Вирт, Никлаус|Никлаус Вирт]]&lt;br /&gt;
| influenced_by = [[Алгол]]&lt;br /&gt;
| influenced = [[Модула-2]], [[Оберон (язык программирования)|Оберон]], [[Компонентный Паскаль]], [[Ада (язык программирования)|Ада]], [[Object Pascal]], [[Java]]&amp;lt;ref&amp;gt;[http://java.sun.com/docs/white/delegates.html White Paper. About Microsoft’s «Delegates»] {{Wayback|url=http://java.sun.com/docs/white/delegates.html |date=20120627043929 }}, java.sun.com&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.fscript.org/prof/javapassport.pdf History of Java, Java Application Servers Report] {{webarchive|url=https://web.archive.org/web/20101229090912/http://www.fscript.org/prof/javapassport.pdf |date=2010-12-29 }} TechMetrix Research, 1999&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web |url=http://queue.acm.org/detail.cfm?id=1017013 |title=A Conversation with James Gosling |access-date=2009-10-16 |archive-date=2015-07-16 |archive-url=https://web.archive.org/web/20150716194245/http://queue.acm.org/detail.cfm?id=1017013 |url-status=live }}&amp;lt;/ref&amp;gt;, [[Oxygene (язык программирования)|Oxygene]]&lt;br /&gt;
| operating_system = [[Linux]], [[Microsoft Windows]], [[Mac OS X]], [[FreeBSD]] и другие&lt;br /&gt;
| license = &lt;br /&gt;
| website = https://www.iso.org/standard/18237.html&lt;br /&gt;
| extension = &amp;lt;code&amp;gt;.pas&amp;lt;/code&amp;gt; для файлов кода, &amp;lt;code&amp;gt;.inc&amp;lt;/code&amp;gt; для [[Заголовочный файл|заголовочных файлов]].&lt;br /&gt;
| последняя версия = ISO/IEC 10206:1991 Stage: 90.93&lt;br /&gt;
| дата выпуска последней версии = [[29 июля]] [[2008 год]]а&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Паска́ль&#039;&#039;&#039; ({{lang-en|Pascal}}) — один из наиболее известных языков программирования&amp;lt;ref&amp;gt;[http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html Индекс популярности языков программирования TIOBE] {{Wayback|url=http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html |date=20181225175216 }}{{ref|en}}&amp;lt;/ref&amp;gt;, используется для обучения программированию в старших классах и на первых курсах вузов, является основой для ряда других языков.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LagrangePAS.jpg|400px|thumb|Пример программы на языке Паскаль]]&lt;br /&gt;
== История ==&lt;br /&gt;
Язык программирования Pascal был создан в 1970 году на основе языка [[Алгол-60]]&amp;lt;ref name=&amp;quot;Wirth, 2007&amp;quot;&amp;gt;{{публикация|книга |язык=en |автор линк=Вирт, Никлаус |автор=Wirth |автор имя=N. |часть=Modula-2 and Oberon |заглавие=HOPL III |подзаголовок=Proceedings of the third ACM SIGPLAN conference on History of programming languages |год=2007 |месяц=06 |издательство=ACM |pages=3-1–3-10 |doi=10.1145/1238844.1238847 |ссылка=http://oberoncore.ru/_media/library/n._wirth_-_modula-2_and_oberon_hopl_iii_.pdf |архив дата=20121222075805 |архив=https://web.archive.org/web/20121222075805/http://oberoncore.ru/_media/library/n._wirth_-_modula-2_and_oberon_hopl_iii_.pdf }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pascal создавался [[Вирт, Никлаус|Никлаусом Виртом]] в 1968—1969 годах после его участия в работе комитета разработки стандарта языка [[Алгол-68]]. Язык назван в честь французского математика, физика, литератора и философа [[Паскаль, Блез|Блеза Паскаля]], который создал одну из первых в мире механических машин, [[Суммирующая машина Паскаля|складывающую два числа]]. Первая публикация Вирта о языке датирована 1970 годом; представляя язык, автор в качестве цели его создания указывал построение небольшого и эффективного языка, способствующего хорошему стилю программирования, использующему [[структурное программирование]] и структурированные данные.{{нет АИ|15|05|2022}}&lt;br /&gt;
&lt;br /&gt;
Последующая работа Вирта была направлена на создание на основе Паскаля языка системного программирования с сохранением возможности вести на его базе систематический, целостный курс обучения профессиональному программированию: «&#039;&#039;The guiding idea was to construct a genuine successor of Pascal meeting the requirements of system engineering, yet also to satisfy my teacher’s urge to present a systematic, consistent, appealing, and teachable framework for professional programming.&#039;&#039;». Результатом этой работы стал язык [[Модула-2]], после которого Вирт занялся разработкой объектно-ориентированного языка программирования [[Оберон (язык программирования)|Oberon]] на основе всех предыдущих разработок&amp;lt;ref name=&amp;quot;Wirth, 2007&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одной из целей создания языка Паскаль Никлаус Вирт считал обучение студентов структурному программированию. До сих пор Паскаль заслуженно считается одним из лучших языков для начального обучения программированию. Его современные модификации, такие как Object Pascal, широко используются в коммерческом программировании (среда Delphi). Также на основе синтаксиса языка Паскаль создан язык программирования [[Structured Text]] (ST) или Structured Control Language (SCL) для [[Программируемый логический контроллер|программируемых логических контроллеров]].{{нет АИ|15|05|2022}}&lt;br /&gt;
&lt;br /&gt;
К 1990-м годам Pascal стал одним из наиболее распространённых в мире алгоритмических языков программирования. Ведущие разработчики программного обеспечения регулярно выпускали новые версии своих компиляторов для этого языка. Популярные компиляторы того времени: Turbo Pascal (разработан компанией [[Borland]]), Microsoft Pascal Compiler, Quick Pascal, Pascal-2, Professional Pascal, USCD Pascal&amp;lt;ref name=&amp;quot;Бородич и др., 1991&amp;quot;&amp;gt;{{публикация|книга |автор=Бородич |автор имя=Ю. С. |автор2=Вальвачев |автор2 имя=А. Н. |автор3=Кузьмич |автор3 имя=А. И. |заглавие=Паскаль для персональных компьютеров |часть=Предисловие |страницы=3 |вид=справ. пособ. |место=Мн. |издательство=Вышэйшая школа |год=1991 |страниц=365 |иллюстрации=ил |isbn=5-339-00662-X |удк=681.3.06(035.5) |ббк=32.973-01я2 }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализации и диалекты ==&lt;br /&gt;
Язык Pascal имеет много реализаций&amp;lt;ref&amp;gt;{{Cite web|lang=|url=http://pascaland.org/pascall.htm|title=Liste compilateur Pascal - Pascal compiler list|author=|website=|date=|publisher=|access-date=2021-01-19|archive-date=2021-04-11|archive-url=https://web.archive.org/web/20210411042236/http://www.pascaland.org/pascall.htm|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== UCSD Pascal ===&lt;br /&gt;
{{main|UCSD Pascal}}&lt;br /&gt;
В 1978 году в [[Калифорнийский университет в Сан-Диего|Калифорнийском университете в Сан-Диего]] была разработана система UCSD p-System, включавшая [[Портирование программного обеспечения|порт]] компилятора Вирта с языка Паскаль в переносимый [[p-код]], редактор исходных кодов, файловую систему и прочее&amp;lt;ref&amp;gt;{{Cite web |url=http://oberoncore.ru/_media/library/n._wirth_-_recollections_about_the_development_of_pascal_hopl_ii_.pdf |title=Wirth N. Recollections about the development of Pascal (HOPL II), 3.3 |access-date=2011-04-16 |archive-date=2012-12-22 |archive-url=https://web.archive.org/web/20121222075737/http://oberoncore.ru/_media/library/n._wirth_-_recollections_about_the_development_of_pascal_hopl_ii_.pdf |url-status=live }}&amp;lt;/ref&amp;gt;, а также реализовывавшая значительное число расширений языка Паскаль, такие как модули, строки символов переменной длины, директивы трансляции, обработка ошибок ввода-вывода, обращение к файлам по именам и другое. Впоследствии основные реализации языка Паскаль основывались на этом диалекте.&lt;br /&gt;
&lt;br /&gt;
=== Object Pascal ===&lt;br /&gt;
{{main|Object Pascal}}&lt;br /&gt;
В [[1986 год]]у фирма [[Apple]] разработала [[Объектно-ориентированное программирование|объектное]] расширение языка Паскаль, получив в результате [[Object Pascal]]. Он был разработан группой [[Ларри Теслер]]а, который консультировался с [[Вирт, Никлаус|Никлаусом Виртом]].&lt;br /&gt;
&lt;br /&gt;
=== Turbo Pascal и Object Pascal ===&lt;br /&gt;
{{main|Turbo Pascal}}&lt;br /&gt;
В [[1983 год]]у появилась первая версия [[Интегрированная среда разработки|интегрированной среды разработки]] Turbo Pascal фирмы [[Borland]], основывавшаяся на одноимённой реализации Паскаля.&lt;br /&gt;
&lt;br /&gt;
В [[1989 год]]у объектное расширение языка было добавлено в Turbo Pascal версии 5.5.&lt;br /&gt;
&lt;br /&gt;
Последняя версия (7.0) была переименована в Borland Pascal.&lt;br /&gt;
&lt;br /&gt;
Объектные средства были позаимствованы из Object Pascal от Apple, языковые различия между объектным Turbo Pascal 5.5 и Object Pascal от Apple крайне незначительны.&lt;br /&gt;
&lt;br /&gt;
Почти в то же самое время, что и Borland, [[Microsoft]] выпустил свою версию объектно-ориентированного языка Паскаль.&amp;lt;ref&amp;gt;Jon Udell, Crash of the Object-Oriented Pascals, BYTE, July, 1989.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;M. I. Trofimov, The End of Pascal?, BYTE, March, 1990, p. 36.&amp;lt;/ref&amp;gt; Эта версия Паскаля не получила широкого распространения.&lt;br /&gt;
&lt;br /&gt;
Дальнейшее развитие реализации Паскаля от Borland породило вариант [[Object Pascal]] от Borland, впоследствии, в ходе развития среды программирования [[Delphi (среда разработки)|Delphi]], получивший [[Delphi (язык программирования)|одноимённое название]].&lt;br /&gt;
&lt;br /&gt;
=== MidletPascal ===&lt;br /&gt;
{{main|MIDletPascal}}&lt;br /&gt;
&lt;br /&gt;
=== Современные реализации Pascal ===&lt;br /&gt;
==== Free Pascal и GNU Pascal ====&lt;br /&gt;
Важным шагом в развитии языка является появление свободных реализаций языка Паскаль [[Free Pascal]] и [[GNU Pascal]], которые не только вобрали в себя черты множества других диалектов языка, но и обеспечили чрезвычайно широкую переносимость написанных на нём программ (например GNU Pascal поддерживает более 20 различных платформ, под более чем 10 различными операционными системами, Free Pascal обеспечивает специальные режимы совместимости с различными распространёнными диалектами языка, такими как Turbo Pascal (полная совместимость), Delphi и другими).&lt;br /&gt;
==== Delphi и Delphi.NET ====&lt;br /&gt;
&#039;&#039;&#039;Delphi&#039;&#039;&#039; - реализация языка Object Pascal, используемая в  среде разработки [[Embarcadero Delphi]]. Delphi.NET - реализация языка Delphi, ориентированная на разработку приложений для платформы [[.NET Framework|Microsoft.Net]].&lt;br /&gt;
==== PascalABC.NET ====&lt;br /&gt;
B [[Южный федеральный университет|Южном федеральном университете]] разработан [[PascalABC.NET]] — язык программирования Паскаль, включающий большинство возможностей языка [[Delphi (язык программирования)|Delphi]], а также ряд собственных расширений. Он основан на платформе [[.NET Framework|Microsoft.NET]] и содержит практически все современные языковые средства: [[Класс (программирование)|классы]], [[перегрузка операторов|перегрузку операций]], [[Интерфейс (объектно-ориентированное программирование)|интерфейсы]], [[Обработка исключений|обработку исключений]], [[обобщённое программирование|обобщённые классы и подпрограммы]], [[сборка мусора (программирование)|сборку мусора]], [[Лямбда-выражение|лямбда-выражения]].&lt;br /&gt;
==== Pascal Next ====&lt;br /&gt;
&lt;br /&gt;
Pascal Next – компилируемый, типизированный, алгоритмический, универсальный язык программирования и среда разработки, ориентированные на решение задачи &#039;&#039;&#039;обучения основам программирования&#039;&#039;&#039;.&lt;br /&gt;
В основе синтаксиса языка Pascal Next лежит синтаксис &amp;quot;классического&amp;quot; Паскаля Вирта. В то же время, синтаксис инструкций выбора и циклов заимствован из Basic, что позволило отказаться от избыточных begin.&lt;br /&gt;
&lt;br /&gt;
== Особенности языка ==&lt;br /&gt;
Особенностями языка являются [[строгая типизация]] и наличие средств [[Процедурное программирование|структурного (процедурного) программирования]]. Паскаль был одним из первых таких языков. По мнению Вирта, язык должен способствовать дисциплинированному программированию, поэтому, наряду со строгой типизацией, в Паскале сведены к минимуму возможные синтаксические неоднозначности, а сам синтаксис автор постарался сделать интуитивно понятным даже при первом знакомстве с языком.&lt;br /&gt;
&lt;br /&gt;
Тем не менее, первоначально язык имел ряд ограничений: невозможность передачи функциям [[Массив (программирование)|массивов]] переменной длины, отсутствие нормальных средств работы с [[динамически распределяемая память|динамической памятью]], ограниченная [[библиотека ввода-вывода]], отсутствие средств для подключения функций, написанных на других языках, отсутствие средств раздельной компиляции и т. п.&amp;lt;!-- Наиболее бросающийся в глаза недостаток синтаксиса — некритически заимствованная из Алгола структура управляющих конструкций (операторов if и циклов), требующая, как правило, постоянного использования составных операторов «begin — end», хотя например в первоначальном варианте языка c они вообще отсутствовали.--&amp;gt; Подробный разбор недостатков языка Паскаль того времени был выполнен [[Керниган, Брайан Уильям|Брайаном Керниганом]] в статье «Почему Паскаль не является моим любимым языком программирования»&amp;lt;ref&amp;gt;{{Cite web |url=http://www.lysator.liu.se/c/bwk-on-pascal.html |title=Why Pascal is Not My Favorite Programming Language |access-date=2004-08-27 |archive-date=2009-04-28 |archive-url=https://web.archive.org/web/20090428163341/https://www.princeton.edu/~mike/unixhistory |url-status=live }}&amp;lt;/ref&amp;gt; (эта статья вышла в начале 1980-х, когда уже существовал язык [[Модула-2]], потомок Паскаля, избавленный от большинства его пороков, а также более развитые диалекты Паскаля). Некоторые недостатки Паскаля были исправлены в ISO-стандарте 1982 года, в частности, в языке появились открытые массивы, давшие возможность использовать одни и те же процедуры для обработки одномерных массивов различных размеров.&lt;br /&gt;
&lt;br /&gt;
Однако многие недостатки языка не проявляются или даже становятся достоинствами при обучении программированию. Кроме того, по сравнению с основным языком программирования в академической среде [[1970-е|1970-х]] (которым был [[Фортран]], обладавший гораздо более существенными недостатками), Паскаль представлял собой значительный шаг вперёд. К 1980-м годам Паскаль стал основой для многочисленных учебных программ, в отдельных случаях на его основе были созданы специализированные обучающие языки программирования, так, в начале 1980-х годов в СССР для обучения школьников основам информатики и вычислительной техники [[Ершов, Андрей Петрович|Андрей Ершов]] разработал алголо-паскалеподобный «[[учебный алгоритмический язык]]».&lt;br /&gt;
&lt;br /&gt;
Наиболее известной реализацией Паскаля, обеспечившей широкое распространение и развитие языка, является Turbo Pascal фирмы [[Borland]], выросшая затем в объектный Паскаль для DOS (начиная с версии 5.5) и Windows и далее в Delphi, в которой были внедрены значительные расширения языка.&lt;br /&gt;
&lt;br /&gt;
== Стандарты ==&lt;br /&gt;
После начала использования Паскаля в [[1970&amp;amp;nbsp;год]]у и появления реализаций, расходящихся не только в дополнениях, но и в синтаксисе, был поднят вопрос о стандартизации языка. Стандарт языка был разработан Никлаусом Виртом в [[1974&amp;amp;nbsp;год]]у совместно с Кетлин Йенсен (Kathleen Jensen).&amp;lt;ref&amp;gt;[https://www.amazon.com/Pascal-User-Manual-Report-Standard/dp/0387976493/ref=sr_1_1/104-1876135-1071931?ie=UTF8&amp;amp;s=books&amp;amp;qid=1194117642&amp;amp;sr=1-1#reader PASCAL: User Manual and Report] {{Wayback|url=https://www.amazon.com/Pascal-User-Manual-Report-Standard/dp/0387976493/ref=sr_1_1/104-1876135-1071931?ie=UTF8&amp;amp;s=books&amp;amp;qid=1194117642&amp;amp;sr=1-1#reader |date=20241208073743 }} ISO Pascal Standard Kathleen Jensen and Niklaus Wirth, 4th edition, Springer Verlag New York, Inc. 1974, 1985, 1991&amp;lt;/ref&amp;gt; В дальнейшем были приняты международный стандарт ISO и американский ANSI. На данный момент выделяют три принципиально разных стандарта: Unextended Pascal (исходный), Extended Pascal (расширенный), Object-Oriented Extensions to Pascal (объектно-ориентированное расширение Паскаля).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|+ Стандарты языка Pascal: исходный, международные [[ISO]] и американские [[ANSI]]&lt;br /&gt;
! Название || Вариант || Кем/где разработан || Год создания&lt;br /&gt;
|-&lt;br /&gt;
!Pascal Standard&lt;br /&gt;
| исходный || Н. Вирт, Кетлин Йенсен || [[1974]]&lt;br /&gt;
|-&lt;br /&gt;
! Pascal Standard&lt;br /&gt;
| исходный || ISO 7185:1983&amp;lt;br&amp;gt;ANSI/[[IEEE]] 770X3.97:1983 || [[1982]]&lt;br /&gt;
|-&lt;br /&gt;
! Unextended Pascal&lt;br /&gt;
| исходный || ISO 7185:1990 || [[1989]]&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;| Extended Pascal&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| расширенный&lt;br /&gt;
| ANSI/IEEE 770X3.160:1989 || 1989&lt;br /&gt;
|-&lt;br /&gt;
| ISO/[[IEC]] 10206 || [[1991]]&lt;br /&gt;
|-&lt;br /&gt;
! Object-Oriented&amp;lt;br&amp;gt;Extensions to Pascal&amp;lt;ref&amp;gt;[http://pascal-central.com/OOE-stds.html Object-Oriented Extensions to Pascal] {{Wayback|url=http://pascal-central.com/OOE-stds.html |date=20210605064414 }}, Technical Committee X3J9, Programming Language Pascal&amp;lt;/ref&amp;gt;&lt;br /&gt;
| объектно-ориентированное расширение || ANSI/X3-TR-13:1994 || [[1993]]&lt;br /&gt;
|}&lt;br /&gt;
Одним из главных дополнительных свойств объектно-ориентированного расширения Extended Pascal стала модульность и средства, облегчающие раздельную компиляцию.&lt;br /&gt;
&lt;br /&gt;
Стандартизация языка была запаздывающей по отношению к реальному появлению в языке тех или иных возможностей. Коммерческие реализации расширяли стандартный Паскаль; так было сделано в UCSD Pascal, модификации [[Object Pascal]] фирмой Apple, Turbo Pascal от Borland (незначительно модифицированная версия Apple) и его ответвлений. Ни одна из распространённых коммерческих реализаций Паскаля не соответствует в точности ни одному из официальных стандартов языка.&lt;br /&gt;
&lt;br /&gt;
== Синтаксис и языковые конструкции ==&lt;br /&gt;
Паскаль, в его первоначальном виде, представляет собой чисто [[Процедурное программирование|процедурный язык]] и включает в себя множество алголоподобных структур и конструкций с зарезервированными словами наподобие &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;then&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;repeat&amp;lt;/code&amp;gt; и т. д. Тем не менее, Паскаль также содержит большое количество возможностей для структурирования информации и абстракций, которые отсутствуют в изначальном [[Алгол-60|Алголе-60]], такие как [[Тип данных|определение типов]], [[Структура (программирование)|записи]], [[Указатель (тип данных)|указатели]], [[Перечислимый тип|перечисления]], и [[Множество|множества]]. Эти конструкции были частично унаследованы или инспирированы от языков [[Симула]]-67, [[Алгол-68]]{{Нет АИ|26|5|2013}}&amp;lt;!-- сравнивая А68 с А60 и паскалем, вижу, что Паскаль — почти А60, А68 наблюдаю скорее в C++ --&amp;gt;, созданного [[Вирт, Никлаус|Никлаусом Виртом]] {{нп3|AlgolW}} и предложены [[Хоар, Чарльз Энтони Ричард|Хоаром]].&lt;br /&gt;
&lt;br /&gt;
В современных диалектах (Delphi Pascal, Free Pascal) доступны такие операции, как перегрузка операторов и функций.&lt;br /&gt;
&lt;br /&gt;
=== Hello, world! ===&lt;br /&gt;
Программы на Паскале начинаются с [[зарезервированное слово|ключевого слова]] &amp;lt;code&amp;gt;Program&amp;lt;/code&amp;gt; и следующего за ним имени программы с &#039;&#039;&#039;точкой с запятой&#039;&#039;&#039; (в некоторых диалектах является необязательным),&lt;br /&gt;
за именем может в скобках следовать список внешних файловых дескрипторов («окружение») в качестве параметров;&lt;br /&gt;
за ним следует тело программы, состоящее из &#039;&#039;секций описания&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;констант&#039;&#039;&#039; (&amp;lt;code&amp;gt;Const&amp;lt;/code&amp;gt;),&lt;br /&gt;
&#039;&#039;&#039;типов&#039;&#039;&#039; (&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;),&lt;br /&gt;
&#039;&#039;&#039;переменных&#039;&#039;&#039; (&amp;lt;code&amp;gt;Var&amp;lt;/code&amp;gt;),&lt;br /&gt;
&#039;&#039;объявлений&#039;&#039; &#039;&#039;&#039;процедур&#039;&#039;&#039; (&amp;lt;code&amp;gt;Procedure&amp;lt;/code&amp;gt;)&lt;br /&gt;
и &#039;&#039;&#039;функций&#039;&#039;&#039; (&amp;lt;code&amp;gt;Function&amp;lt;/code&amp;gt;)&lt;br /&gt;
и следующего за ними [[Блок (программирование)|блока операторов]], являющегося &#039;&#039;&#039;точкой входа&#039;&#039;&#039; в программу.&lt;br /&gt;
В языке Паскаль &#039;&#039;&#039;блок&#039;&#039;&#039; ограничивается ключевыми словами &amp;lt;code&amp;gt;begin&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt;.&lt;br /&gt;
Операторы разделяются [[Точка с запятой|точками с запятой]],&lt;br /&gt;
после тела помещается [[Точка (знак препинания)|точка]],&lt;br /&gt;
служащая признаком конца программы.&lt;br /&gt;
&lt;br /&gt;
[[Чувствительность к регистру символов|Регистр символов]]&lt;br /&gt;
в Паскале не имеет значения.&lt;br /&gt;
&lt;br /&gt;
Таким образом, простейшая («пустая») программа на Паскале будет выглядеть следующим образом:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
program p;&lt;br /&gt;
begin&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Приведённая выше программа не выполняет никаких действий и содержит &#039;&#039;&#039;пустой блок&#039;&#039;&#039; операторов.&lt;br /&gt;
&lt;br /&gt;
Пример программы, выводящей строку «[[Hello, world!]]»:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
program hello;&lt;br /&gt;
begin&lt;br /&gt;
  writeln(&#039;Hello, World!&#039;);  // оператор вывода строки &lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Типы данных ===&lt;br /&gt;
&lt;br /&gt;
==== Простые типы ====&lt;br /&gt;
В стандартном и расширенном Паскале есть такие &#039;&#039;&#039;простые&#039;&#039;&#039; типы: [[числа с плавающей запятой]] (&amp;lt;code&amp;gt;real&amp;lt;/code&amp;gt;), [[Целый тип|целые]] (&amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;), [[Символьный тип|символьный]] (&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;), [[Логический тип|логический]] (&amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt;) и [[Перечислимый тип|перечисления]] (конструктор нового типа, введённый в Pascal).&lt;br /&gt;
&lt;br /&gt;
[[Turbo Pascal]] дополнил язык вариациями этих типов: например, &amp;lt;code&amp;gt;shortint&amp;lt;/code&amp;gt; будет короче &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;, а &amp;lt;code&amp;gt;longint&amp;lt;/code&amp;gt; — длиннее.&lt;br /&gt;
&lt;br /&gt;
Современные диалекты Pascal, такие, как [[FPC]] или [[Delphi (язык программирования)|Delphi]], считают, что &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt; — это наиболее подходящий для данной машины целый, применяемый, например, для [[массив (программирование)|индексов массива]], а &amp;lt;code&amp;gt;shortint&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;longint&amp;lt;/code&amp;gt; и другие — целые определённой длины; это удобно при [[кроссплатформенное ПО|кроссплатформенном]] программировании. Аналогично и с дробными числами.&lt;br /&gt;
&lt;br /&gt;
Ещё раз расширили типы при переходе на [[x64]] — «просто целое» (&amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;) осталось 32-битным, но потребовался особый тип, который равен &amp;lt;code&amp;gt;longint&amp;lt;/code&amp;gt; на x86 и &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt; на x64.&lt;br /&gt;
&lt;br /&gt;
Целочисленные типы:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Тип !! Диапазон !! Формат !! Размер в байтах !! Примечания&lt;br /&gt;
|-&lt;br /&gt;
| Byte || 0..255 || Беззнаковый || 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| ShortInt || −128..127 || Знаковый || 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| SmallInt || −32768..32767 ||Знаковый || 2 || Может не существовать; вместо него Integer с тем же диапазоном&lt;br /&gt;
|-&lt;br /&gt;
| Word || 0..65535 || Беззнаковый || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| LongWord || 0..4294967295 || Беззнаковый || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| LongInt || −2147483648..2147483647 ||Знаковый || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| Int64 || −9223372036854775808..9223372036854775807 || Знаковый || 8 ||&lt;br /&gt;
|-&lt;br /&gt;
| QWord || 0..18446744073709551615 || Беззнаковый ||8 ||&lt;br /&gt;
|-&lt;br /&gt;
| Integer || -32768..32767. || Знаковый || 2 или 4 || Наиболее быстрый целый; SmallInt или LongInt&lt;br /&gt;
|-&lt;br /&gt;
| Cardinal || ? || Беззнаковый || ? || Наиболее быстрый целый; обычно LongWord&lt;br /&gt;
|-&lt;br /&gt;
| NativeInt || ? || Знаковый || ? || Соответствует машинному регистру; LongInt или Int64&lt;br /&gt;
|-&lt;br /&gt;
| NativeUInt || ? || Беззнаковый || ? || Соответствует машинному регистру; LongWord или QWord&lt;br /&gt;
|}&lt;br /&gt;
Числа с плавающей запятой:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Тип !! Диапазон !! Кол-во значащих цифр!! Размер в байтах !! Поддержка&lt;br /&gt;
|-&lt;br /&gt;
| Real || зависит от платформы || ??? || ??? || Все компиляторы; на современных обычно эквивалентен Double&lt;br /&gt;
|-&lt;br /&gt;
| Real48 || 2.9E−39..1.7E38 || 11−12 || 6 || Borland; в Turbo Pascal назывался Real; не использует сопроцессора и потому результат повторяем до бита&lt;br /&gt;
|-&lt;br /&gt;
| Single || 1.5E−45..3.4E38 || 7−8 || 4 || Большинство вариантов под [[IEEE 754]]-совместимые машины&lt;br /&gt;
|-&lt;br /&gt;
| Double || 5.0E−324..1.7E308 || 15−16 || 8 || Большинство вариантов под [[IEEE 754]]-совместимые машины&lt;br /&gt;
|-&lt;br /&gt;
| Extended || 3.4E−4951..1.1E4932 || 19−20 || 10 || Большинство вариантов под x86&lt;br /&gt;
|-&lt;br /&gt;
| Comp || colspan=2| −9223372036854775808..9223372036854775807 || 8 || Borland; рассчитываемое на сопроцессоре 8-байтовое целое; актуально для 16-битного x86&lt;br /&gt;
|-&lt;br /&gt;
| Currency || colspan=2 | −922337203685477.5808..922337203685477.5807 || 8 || Borland и другие компиляторы под Windows; связано с [[OLE]]; [[фиксированная запятая]] с единицей, равной 10000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var { секция объявления переменных }&lt;br /&gt;
  r: Real;  { переменная вещественного типа }&lt;br /&gt;
  i: Integer;  { переменная целого типа }&lt;br /&gt;
  c: Char;  { переменная-символ }&lt;br /&gt;
  b: Boolean;  { логическая переменная }&lt;br /&gt;
  s: String; { переменная строки }&lt;br /&gt;
  t: Text; { переменная для объявления текстового файла }&lt;br /&gt;
  e: (apple, pear, banana, orange, lemon);  { переменная типа-перечисления }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В Pascal над целыми типами (byte, shortint, word, integer, longint и их диапазоны) допустимы побитовые операции. Логические операции над битами:&lt;br /&gt;
&lt;br /&gt;
Над битами двух целых операндов можно выполнять ранее рассмотренные логические операции: not, and, or, xor. Отличие между побитовыми и логическими операциями состоит в том, что побитовые (поразрядные) операции выполняются над отдельными битами операндов, а не над их значением в десятичном (обычно) представлении.&lt;br /&gt;
&lt;br /&gt;
Выделяется понятие &#039;&#039;порядковых&#039;&#039; типов данных (ordinal), к ним относятся целые типы (знаковые и беззнаковые), логический (&amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt;), символьный (&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;), перечислимые типы и типы-диапазоны.&lt;br /&gt;
&lt;br /&gt;
Порядковые типы задаются целым числом (кодом), которое можно получить с помощью функции ord. Все операции, выполняемые над порядковыми типами, выполняются с их кодами.&lt;br /&gt;
&lt;br /&gt;
Диапазоны содержат подмножество значений других порядковых типов:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  x: 1..10;&lt;br /&gt;
  y: &#039;a&#039;..&#039;z&#039;;&lt;br /&gt;
  z: pear..orange;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для порядковых типов определены операции &amp;lt;code&amp;gt;inc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dec&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;succ&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pred&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ord&amp;lt;/code&amp;gt;, операции сравнения (&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;=&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;gt;&amp;lt;/code&amp;gt;), их можно использовать в операторах &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; (как счётчик цикла), как границы массивов, для задания элементов множеств и типов-диапазонов.&lt;br /&gt;
&lt;br /&gt;
В Pascal, в отличие от Си-подобных языков, с типами &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt; арифметические целочисленные операции не определены.&lt;br /&gt;
&lt;br /&gt;
==== Множества ====&lt;br /&gt;
В отличие от многих распространённых языков, Pascal поддерживает специальный тип данных &#039;&#039;множество&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  set1: set of 1..10;&lt;br /&gt;
  set2: set of &#039;a&#039;..&#039;z&#039;;&lt;br /&gt;
  set3: set of pear..orange;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Множество — фундаментальное понятие в современной математике, которое может быть использовано во многих алгоритмах.&lt;br /&gt;
&lt;br /&gt;
В паскале тип множество может содержать только однотипные элементы порядкового типа. Эта особенность широко используется и обычно быстрее эквивалентной конструкции в языке, не поддерживающем множества. К примеру, для большинства компиляторов Паскаля:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
if i in [5..10] then { проверка на принадлежность элемента множеству }&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
обработается быстрее, чем&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
if (i&amp;gt;=5) and (i&amp;lt;=10) then { проверка логическими условиями }&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для задания значения множества используется список элементов множества, отделённых запятыми и заключённый в квадратные скобки (как уже было показано выше):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var { секция объявления переменных }&lt;br /&gt;
 d:set of char;&lt;br /&gt;
begin { начало блока }&lt;br /&gt;
 d:=[&#039;a&#039;,&#039;b&#039;]; &lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В Паскале Йенсен и Вирта строки представлялись как упакованные массивы символов; следовательно, они имели фиксированную длину и обычно дополнялись до этой длины пробелами.&lt;br /&gt;
&lt;br /&gt;
==== Составные типы ====&lt;br /&gt;
Новые типы могут быть определены из существующих:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type { секция объявления типов }&lt;br /&gt;
  x = Integer;&lt;br /&gt;
  y = x;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Более того, из примитивных типов могут быть сконструированы составные:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type { секция объявления типов }&lt;br /&gt;
  a = Array [1..10] of Integer;  { определение массива }&lt;br /&gt;
  b = record  { определение записи }&lt;br /&gt;
        x: Integer;&lt;br /&gt;
        y: Char;&lt;br /&gt;
      end;&lt;br /&gt;
  c = File of a;  { определение файла }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Файловые типы в Паскале делятся на типизированные, текстовые и файлы без типов.&lt;br /&gt;
&lt;br /&gt;
Как показано в вышеприведённом примере, типизированные [[файл]]ы в Паскале — это последовательности однотипных элементов. Для каждого файла существует переменная-указатель на буфер, которая обозначается &amp;lt;code&amp;gt;f^&amp;lt;/code&amp;gt;. Процедуры &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; (для чтения) и &amp;lt;code&amp;gt;put&amp;lt;/code&amp;gt; (для записи) перемещают указатель к следующему элементу. Чтение реализовано так, что &amp;lt;code&amp;gt;read(f, x)&amp;lt;/code&amp;gt; представляет собою то же, что и &amp;lt;code&amp;gt;get(f); x:=f^&amp;lt;/code&amp;gt;. Соответственно, запись реализована так, что &amp;lt;code&amp;gt;write(f, x)&amp;lt;/code&amp;gt; представляет собою то же, что и &amp;lt;code&amp;gt;f^ := x; put(f)&amp;lt;/code&amp;gt;. Текстовые файлы &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; определены как расширение типа &amp;lt;code&amp;gt;file of char&amp;lt;/code&amp;gt; и помимо стандартных операций над типизированными файлами (чтение, запись символа), позволяют осуществлять символьный ввод-вывод в файл всех типов данных аналогично консольному вводу-выводу.&lt;br /&gt;
&lt;br /&gt;
Файлы без типов объявляются как переменные типа &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;. С ними можно проводить операции побайтового нетипизированного ввода-вывода по несколько блоков байт указанной длины через буфер, для этого служат специальные процедуры &amp;lt;code&amp;gt;blockread&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;blockwrite&amp;lt;/code&amp;gt; (расширение UCSD).&lt;br /&gt;
&lt;br /&gt;
==== Строки ====&lt;br /&gt;
В современном Паскале&amp;lt;ref&amp;gt;{{Cite web |url=http://www.cs.bilkent.edu.tr/~guvenir/courses/CS315/iso7185pascal.pdf |title=ISO 7185 Pascal |access-date=2009-04-12 |archive-date=2006-11-25 |archive-url=https://web.archive.org/web/20061125202811/http://cs.bilkent.edu.tr/%7Eguvenir/courses/CS315/iso7185pascal.pdf |url-status=live }}&amp;lt;/ref&amp;gt; для работы со строками используется встроенный тип &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, поддерживающий операции конкатенации (&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;) и сравнения (&amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;=&amp;lt;/code&amp;gt;). Строки сравниваются в [[Лексикографический порядок|лексикографическом порядке]]. Например, строки считаются равными, если они имеют одинаковую длину и коды всех символов с одинаковыми индексами совпадают.&lt;br /&gt;
&lt;br /&gt;
Тип &amp;lt;code&amp;gt;string [n]&amp;lt;/code&amp;gt; или просто &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; в диалектах языка 1970—1990-х годов определялся в виде массива символов &amp;lt;code&amp;gt;array [0..n] of char&amp;lt;/code&amp;gt; (n по умолчанию принимало значение 80 в UCSD Pascal и 255 в Turbo/Borland Pascal),&lt;br /&gt;
нулевой элемент массива при таком представлении служит для задания длины строки, соответственно строка могла иметь максимальный размер 255 символов. &amp;lt;!--По умолчанию в качестве String используется тип AnsiString в старых версиях Delphi (теперь [[юникод]]) и [[Free Pascal]]-- не совсем грамотно сформулировано- юникод это не тип данных. надо убрать либо перефразировать--&amp;gt;По умолчанию в Delphi и FreePascal в качестве String используется тип AnsiString, память под который выделяется и освобождается компилятором динамически, а максимальный размер строки в текущих реализациях составляет 2 гигабайта. Кроме того, в Delphi и Free Pascal в качестве &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; может использоваться тип UnicodeString, где применяется 16-битное представление символов в кодировке [[UCS-2]], при этом средства преобразования из однобайтовых строк в многобайтовые и обратно в стандартной библиотеке FPC отсутствуют, но имеются в Delphi.&amp;lt;!--В то же время, многие операции над строками &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; в текущих версиях систем программирования реализованы через ориентированный на язык Си API, в результате чего символ с нулевым кодом может восприниматься при обработке как признак конца строки, в отличие от &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;[http://www.cyberguru.ru/programming/delphi/strings-details-page6.html Тонкости работы со строками в Delphi. Нулевой символ в середине строки]&amp;lt;/ref&amp;gt; //тип pChar используется сам по себе как указатель на c-подобную строку, то есть с типом AnsiString как таковым это не связано--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В Delphi 2009 и выше имеется конструкция для объявления AnsiString с определённой кодовой страницей:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  CyrillicString = AnsiString(1251);&lt;br /&gt;
  CP866String = AnsiString(20866);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Указатели ====&lt;br /&gt;
Паскаль поддерживает использование [[Указатель (тип данных)|указателей]] (типизированные &amp;lt;code&amp;gt;^тип&amp;lt;/code&amp;gt; и нетипизированные &amp;lt;code&amp;gt;pointer&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  a = ^b;&lt;br /&gt;
  b = record&lt;br /&gt;
        x: Integer;&lt;br /&gt;
        y: Char;&lt;br /&gt;
        z: a;&lt;br /&gt;
      end;&lt;br /&gt;
var&lt;br /&gt;
  pointer_to_b:a;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь переменная &amp;lt;code&amp;gt;pointer_to_b&amp;lt;/code&amp;gt; — указатель на тип данных &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, являющийся записью. Типизированный указатель может быть определён (&#039;&#039;опережающее определение&#039;&#039;) перед объявлением типа, на который он ссылается. Это одно из &#039;&#039;исключений&#039;&#039; к &#039;&#039;&#039;правилу&#039;&#039;&#039;, которое гласит, что &#039;&#039;любой элемент (константа, тип, переменная, процедура, функция) должен быть объявлен перед тем, как используется&#039;&#039;. Введение этого исключения позволяет организовывать &#039;&#039;рекуррентные&#039;&#039; определения структур данных, в том числе такие, как [[Линейный список|линейные списки]], [[стек]]и, [[Очередь (программирование)|очереди]], [[Дерево (структура данных)|деревья]], включая указатель на запись в описание этой записи (см. также: нулевой указатель — &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для типизированного указателя определена операция &#039;&#039;&#039;разыменования&#039;&#039;&#039; (её синтаксис: &amp;lt;code&amp;gt;указатель^&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Чтобы создать новую запись и присвоить значение &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; и символ &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; полям &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; в ней, необходимы следующие операторы:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
new(pointer_to_b); { выделение памяти указателю }&lt;br /&gt;
&lt;br /&gt;
pointer_to_b^.x := 10; { разыменовывание указателя и обращение к полю записи }&lt;br /&gt;
pointer_to_b^.y := &#039;A&#039;;&lt;br /&gt;
pointer_to_b^.z := nil;&lt;br /&gt;
...&lt;br /&gt;
dispose(pointer_to_b); { освобождение памяти из-под указателя }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для целей обращения к полям записей и объектов можно также использовать оператор &amp;lt;code&amp;gt;with&amp;lt;/code&amp;gt;, как показано в примере:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
new(pointer_to_b);&lt;br /&gt;
&lt;br /&gt;
with pointer_to_b^ do&lt;br /&gt;
begin&lt;br /&gt;
  x := 10;&lt;br /&gt;
  y := &#039;A&#039;;&lt;br /&gt;
  z := nil&lt;br /&gt;
end;&lt;br /&gt;
...&lt;br /&gt;
dispose(pointer_to_b);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Процедурный тип ====&lt;br /&gt;
В оригинальном языке Паскаль Йенсен и Вирта процедурный тип использовался только при описании формального параметра. Уже в TP существовал полноправный [[Делегат (программирование)|процедурный тип]]. В объявлении типа ставится заголовок процедуры либо функции (без имени), обобщённо описывающий интерфейс подпрограммы. Значение этого типа содержит указатель на подпрограмму с заголовком, соответствующую описанному в объявлении типа. С помощью идентификатора переменной может происходить вызов соответствующей процедуры или функции.&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример подпрограмм для Pascal&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type myfunc=function:string;&lt;br /&gt;
&lt;br /&gt;
function func1:string;&lt;br /&gt;
begin&lt;br /&gt;
 func1:=&#039;func № 1&#039;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function func2:string;&lt;br /&gt;
begin&lt;br /&gt;
 func2:=&#039;func № 2&#039;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
var fun:myfunc;&lt;br /&gt;
begin&lt;br /&gt;
 fun:=@func1;&lt;br /&gt;
 writeln(fun) {происходит вызов функции func1}&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Операторы управления ===&lt;br /&gt;
Паскаль — язык [[Структурное программирование|структурного программирования]], что означает, что программа состоит из выполняющихся последовательно отдельных стандартных операторов, в идеале — без использования команды &amp;lt;code&amp;gt;[[GOTO]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример для Pascal&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
while a &amp;lt;&amp;gt; b do { цикл с предусловием }&lt;br /&gt;
  writeln(&#039;Ожидание&#039;);&lt;br /&gt;
&lt;br /&gt;
if a &amp;gt; b then { условный оператор }&lt;br /&gt;
  writeln(&#039;Условие выполнилось&#039;)&lt;br /&gt;
else { else-секция - может отсутствовать}&lt;br /&gt;
  writeln(&#039;Условие не выполнилось&#039;);&lt;br /&gt;
&lt;br /&gt;
for i := 1 to 10 do { итерационный цикл }&lt;br /&gt;
  writeln(&#039;Итерация №&#039;, i:1);&lt;br /&gt;
&lt;br /&gt;
for i in [1..10] do { итерационный цикл по множеству }&lt;br /&gt;
  writeln(&#039;Итерация №&#039;, i:1); { появился в версии 2.4.0 }&lt;br /&gt;
&lt;br /&gt;
with a do {Оператор With - метод ускорения доступа к полям записи}&lt;br /&gt;
  begin&lt;br /&gt;
    l:=1;&lt;br /&gt;
    k:=2;&lt;br /&gt;
    p:=-3;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
repeat { цикл с постусловием }&lt;br /&gt;
  a := a + 1&lt;br /&gt;
until a = 10;&lt;br /&gt;
&lt;br /&gt;
case i of { условный оператор множественного выбора }&lt;br /&gt;
  0: write(&#039;ноль&#039;);&lt;br /&gt;
  1: write(&#039;один&#039;);&lt;br /&gt;
  2: write(&#039;два&#039;)&lt;br /&gt;
  else write(&#039;неизвестное число&#039;) { else-секция - может отсутствовать}&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
В операторах &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt; в качестве выполняемого оператора может использоваться &#039;&#039;блок&#039;&#039;. Такая конструкция, представляющая собой обычный оператор или блок, называется &#039;&#039;сложным оператором&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
В Turbo Pascal для управления процессом компиляции существуют директивы, которые помещаются в комментарии и позволяют переключать режимы работы компилятора — например, включать и отключать проверку операций ввода-вывода, переполнения:&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример для Pascal&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  assign(inp,&#039;text.txt&#039;);&lt;br /&gt;
  {$I-} { отключение режима IO checking- генерации кода завершения программы в случае ошибки ввода-вывода }&lt;br /&gt;
        { (для случая, если файл не найден)} &lt;br /&gt;
  reset(inp);&lt;br /&gt;
  {$I+} { включение режима  IO checking }&lt;br /&gt;
  if IOresult=0 then begin { проверяем значение переменой ioresult(&amp;lt;&amp;gt;0 в случае ошибки ввода-вывода) }&lt;br /&gt;
    ...&lt;br /&gt;
    close(inp);&lt;br /&gt;
  end else writeln(&#039;file not found&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Существуют директивы, аналогичные директивам препроцессора C/C++ (&amp;lt;code&amp;gt;$ifdef&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$define&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$include&amp;lt;/code&amp;gt;), они обрабатываются компилятором в процессе компиляции.&lt;br /&gt;
&lt;br /&gt;
=== Процедуры и функции ===&lt;br /&gt;
В Паскале подпрограммы делятся на процедуры и функции. При этом, функции явно возвращают значение (результат) определённого типа, а процедуры явно ничего не возвращают.&lt;br /&gt;
&lt;br /&gt;
Синтаксически описание процедуры или функции состоит из &#039;&#039;заголовка&#039;&#039;, содержащего ключевое слово &amp;lt;code&amp;gt;procedure&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, имени, за которым может следовать описание передаваемых (формальных) параметров в скобках. Для функции через символ «двоеточие» &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; указывается тип возвращаемого значения. Заголовок заканчивается символом «точка с запятой» &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;. После заголовка следует &#039;&#039;тело&#039;&#039;, (возможно) содержащее секции описания локальных констант, типов, переменных, процедур, функций и (обязательно) содержащее блок операторов, после которого ставится символ «точка с запятой» &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример программы для Pascal&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
program mine(output);&lt;br /&gt;
&lt;br /&gt;
var i : integer;&lt;br /&gt;
&lt;br /&gt;
procedure print(var j: integer);&lt;br /&gt;
&lt;br /&gt;
  function next(k: integer): integer;&lt;br /&gt;
  begin&lt;br /&gt;
    next := k + 1&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  writeln(&#039;Всего: &#039;, j);&lt;br /&gt;
  j := next(j)&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  i := 1;&lt;br /&gt;
  while i &amp;lt;= 10 do&lt;br /&gt;
    print(i)&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Тело процедуры, как и программы, в свою очередь может содержать описания процедур и функций. Таким образом, процедуры и функции могут быть вложены друг в друга как угодно глубоко, при этом тело программы — самое верхнее в цепочке.&lt;br /&gt;
&lt;br /&gt;
Причём содержимое секций описания переменных, типов, констант, внешнего тела (процедуры, функции, программы), расположенных перед описанием процедуры/функции, доступны внутри неё. Также, в большинстве диалектов из процедуры можно обращаться к параметрам внешней процедуры.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Каждая процедура/функция может содержать собственные объявления меток, констант, типов, переменных, а также других процедур и функций, причём именно в вышеуказанном порядке. Такой порядок объявлений установлен с целью добиться эффективного компилирования за один проход. Тем не менее, в некоторых диалектах этот строгий порядок секций не является обязательным.//-во всяком случае в Turbo Pascal,Delphi,FPC это не так&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вслед за заголовком процедур/функций вместо тела может помещаться ключевое слово &amp;lt;code&amp;gt;forward&amp;lt;/code&amp;gt;, это делается в том случае, если описание процедуры/функции располагается в программе после её вызова, и связано с поддерживаемой в Паскале возможностью компиляции программы за один проход.&lt;br /&gt;
&lt;br /&gt;
==== Стандартные математические функции и процедуры Паскаля ====&lt;br /&gt;
&lt;br /&gt;
===== Математические функции =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 |Наименование функции ||Тип аргумента ||Тип значения||Результат вычисления&lt;br /&gt;
 |-&lt;br /&gt;
 |Abs(x)||целый  вещественный||целый  вещественный||Абсолютное значение  &amp;quot;х&amp;quot; &lt;br /&gt;
 |-&lt;br /&gt;
 |Sin(x)||вещественный||вещественный||синус  &amp;quot;х&amp;quot;  рад. &lt;br /&gt;
 |-&lt;br /&gt;
 |Cos(x)||вещественный||вещественный||косинус &amp;quot;х&amp;quot; рад.         &lt;br /&gt;
 |-&lt;br /&gt;
 |Arctan(x)||вещественный||вещественный||арктангенс &amp;quot;х&amp;quot; ( -Pi/2 &amp;lt;y&amp;lt; Pi/2 )  &lt;br /&gt;
 |-&lt;br /&gt;
 |Sqrt(x)||вещественный||вещественный||квадратный корень из &amp;quot;х&amp;quot;     &lt;br /&gt;
 |-&lt;br /&gt;
 |Sqr(x)||целый вещественный||целый вещественный||значение  &amp;quot;х&amp;quot; в квадрате ( &#039;&#039;x&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; )  &lt;br /&gt;
 |-&lt;br /&gt;
 |Power(a,x)||вещественный||вещественный||значение &amp;quot;a&amp;quot; в степени &amp;quot;x&amp;quot; ( &#039;&#039;a&#039;&#039;&amp;lt;sup&amp;gt;x&amp;lt;/sup&amp;gt; )&lt;br /&gt;
 |-&lt;br /&gt;
 |Exp(x)||вещественный||вещественный||значение  &amp;quot;е&amp;quot; в степени &amp;quot;х&amp;quot; ( &#039;&#039;e&#039;&#039;&amp;lt;sup&amp;gt;x&amp;lt;/sup&amp;gt;,  где e= 2.718282... )  &lt;br /&gt;
 |-&lt;br /&gt;
 |Ln(x)||вещественный||вещественный||натуральный логарифм &amp;quot;х&amp;quot; ( х &amp;gt; 0 ) &lt;br /&gt;
 |-&lt;br /&gt;
 |Frac(x)||вещественный||вещественный||дробная часть  &amp;quot;х&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 |Int(x)||вещественный||вещественный||целая часть  &amp;quot;х&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 |Random||-||вещественный||случайное число ( 0 &amp;lt;=y&amp;lt; 1 )  &lt;br /&gt;
 |-&lt;br /&gt;
 |Random(x)||Word||Word||случайное число ( 0 &amp;lt;=y&amp;lt; x )     &lt;br /&gt;
 |-&lt;br /&gt;
 |Succ(c)||порядковый||порядковый||следующий за  &amp;quot;с&amp;quot; символ        &lt;br /&gt;
 |-&lt;br /&gt;
 |Pred(c)||порядковый||порядковый||предшествующий &amp;quot;с&amp;quot; символ        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Математические процедуры =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 |Наименование функции ||Тип аргумента ||Тип значения||Результат вычисления&lt;br /&gt;
 |-&lt;br /&gt;
 |Inc(x)||целый||целый||Увеличивает  &amp;quot;х&amp;quot;  на 1  ( x:=x+1; )  &lt;br /&gt;
 |-&lt;br /&gt;
 |Dec(x)||целый||целый||Уменьшает    &amp;quot;х&amp;quot;  на 1  ( x:=x-1; )  &lt;br /&gt;
 |-&lt;br /&gt;
 |Inc(x , n)||целый||целый||&amp;quot;х&amp;quot;  на n  ( x:=x+n; )&lt;br /&gt;
 |-&lt;br /&gt;
 |Dec(x , n)||целый||целый||&amp;quot;х&amp;quot;  на n  ( x:=x-n; )  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Процедуры преобразования типов переменных =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 |Наименование функции ||Тип аргумента ||Тип значения||Результат вычисления&lt;br /&gt;
 |-&lt;br /&gt;
 |Str(x , s)||x-целый или вещественный||s-строковый||Последовательность символов &amp;quot;s&amp;quot; из цифр числа &amp;quot;x&amp;quot; &lt;br /&gt;
 |-&lt;br /&gt;
 |Val(s , v, cod)||s-строковый||v-целый или вещественный cod-целый||Двоичная форма числа последовательности &amp;quot;s&amp;quot;  cod=0 (код ошибки)                &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Функции преобразования типов переменных =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 |Наименование функции ||Тип аргумента ||Тип значения||Результат вычисления&lt;br /&gt;
 |-&lt;br /&gt;
 |Trunc(x)||вещественный||LongInt||целая часть  &amp;quot;х&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 |Round(x)||вещественный||LongInt||округление &amp;quot;х&amp;quot; до целого  &lt;br /&gt;
 |-&lt;br /&gt;
 |Odd(x)||целый||логический||возвращает  True  если  &amp;quot;х&amp;quot; - нечётное число&lt;br /&gt;
 |-&lt;br /&gt;
 |Chr(x)||Byte||Char||Символ ASCII кода  &amp;quot;х&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 |Ord(x)||Char||Byte||ASCII код символа  &amp;quot;x&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Модули ===&lt;br /&gt;
До появления связных модулей в их современном виде некоторые реализации Паскаля поддерживали модульность за счёт механизма включения заголовочных файлов, похожего на механизм &amp;lt;code&amp;gt;#include&amp;lt;/code&amp;gt; в языке Си: с помощью специальной директивы, оформляемой в виде псевдокомментария, например, &amp;lt;code&amp;gt;{$INCLUDE &amp;quot;файл&amp;quot;}&amp;lt;/code&amp;gt;, содержимое указанного файла прямо включалось в текст программы в исходном, текстовом виде. Таким образом можно было разделить программный код на множество фрагментов, для удобства редактирования, но перед компиляцией они автоматически объединялись в один файл программы, который в итоге и обрабатывался компилятором. Такая реализация модульности примитивна и имеет множество очевидных недостатков, поэтому она была быстро заменена.&lt;br /&gt;
&lt;br /&gt;
Современные реализации языка Паскаль (начиная с UCSD Pascal) поддерживают модули. Программные модули могут быть двух видов: модуль главной программы, который, как обычно, начинается с ключевого слова program и тело которого содержит код, запускаемый после загрузки программы в память, и вспомогательных модулей, содержащих типы, константы, переменные, процедуры и функции, предназначенные для использования в других модулях, в том числе в главном модуле.&lt;br /&gt;
&lt;br /&gt;
==== Структура ====&lt;br /&gt;
Общая структура подключаемого модуля на Паскале выглядит следующим образом:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
unit UnitName1;&lt;br /&gt;
interface&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
begin {может отсутствовать - используется, если необходимо поместить операторы инициализации}&lt;br /&gt;
  ...&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Возможен также ещё один вариант:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
unit UnitName2;&lt;br /&gt;
interface&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
initialization&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
finalization&lt;br /&gt;
  ....&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В отличие от главной программы, файл модуля начинается с ключевого слова &amp;lt;code&amp;gt;UNIT&amp;lt;/code&amp;gt;, за которым следует имя модуля и точка с запятой. Современные реализации, как правило, требуют, чтобы имя модуля совпадало с именем файла исходного кода, в котором этот модуль содержится. Модуль содержит три секции: интерфейсную секцию, секцию реализации и тело модуля.&lt;br /&gt;
&lt;br /&gt;
Интерфейсная секция идёт первой, начинается с ключевого слова &amp;lt;code&amp;gt;INTERFACE&amp;lt;/code&amp;gt; и заканчивается в том месте модуля, где начинается секция реализации или тело. В интерфейсной секции объявляются те объекты (типы, константы, переменные, процедуры и функции — для них помещаются заголовки), которые должны быть доступны извне модуля. При этом допускается частичное объявление типов: они могут объявляться без указания структуры, одним только именем. При использовании такого типа во внешней программе допускается объявление переменных и параметров этого типа, присваивание значений, но невозможно получить доступ к деталям его реализации. Процедуры и функции в интерфейсной секции объявляются в виде форвардов — заголовков с параметрами, но без тела. Состав интерфейсной секции модуля таков, что его достаточно для генерации кода, использующего данный модуль. Переменные, объявленные в интерфейсной секции, являются глобальными, то есть существуют в единственном экземпляре и доступны во всех частях программы, использующих данный модуль.&lt;br /&gt;
&lt;br /&gt;
Секция реализации следует за интерфейсной и начинается с ключевого слова &amp;lt;code&amp;gt;IMPLEMENTATION&amp;lt;/code&amp;gt;. В нём располагаются описания процедур и функций, объявленных в интерфейсной секции, а также описания типов, констант, переменных, процедур и функций, которые необходимы для реализации интерфейсных процедур и функций. Описание процедуры или функции, объявленной в интерфейсной секции, должно иметь в точности такой же заголовок, как в объявлении. В теле могут использоваться другие процедуры и функции данного модуля, объявленные как в интерфейсной части, так и в секции реализации. Переменные, объявленные в секции реализации, являются, по сути, глобальными (то есть существует только один экземпляр каждой такой переменной на всю программу), но доступны они только из процедур и функций, описанных в секции реализации данного модуля, а также из его тела. Если в интерфейсной секции есть сокращённые объявления типов, то эти типы должны быть полностью описаны в секции реализации.&lt;br /&gt;
&lt;br /&gt;
Тело модуля начинается находящимся на верхнем уровне вложенности ключевым словом &amp;lt;code&amp;gt;BEGIN&amp;lt;/code&amp;gt;. Тело содержит программный код, который выполняется один раз при загрузке модуля. Тело может применяться для инициализации, присваивания начальных значений переменным модуля, выделения ресурсов для его работы и так далее. Тело модуля может отсутствовать. В ряде реализаций Паскаля, например, в Delphi, вместо тела модуля могут применяться две секции (также необязательные) — &amp;lt;code&amp;gt;INITIALIZATION&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;FINALIZATION&amp;lt;/code&amp;gt;. Они располагаются в конце модуля, после соответствующего ключевого слова. Первая — секция инициализации, — содержит код, который должен быть выполнен при загрузке модуля, вторая — секция финализации, — код, который будет выполнен при выгрузке модуля. Секция финализации может выполнять действия, обратные инициализации — удалять объекты из памяти, закрывать файлы, освобождать выделенные ресурсы.&lt;br /&gt;
&lt;br /&gt;
Модуль заканчивается ключевым словом &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt; с точкой.&lt;br /&gt;
&lt;br /&gt;
==== Использование ====&lt;br /&gt;
Чтобы использовать модуль, главная программа или другой модуль должны импортировать данный модуль, то есть содержать объявление о его использовании. Это объявление делается с помощью инструкции подключения модулей, представляющей собой ключевое слово &amp;lt;code&amp;gt;USES&amp;lt;/code&amp;gt;, за которым через запятую следуют имена модулей, которые требуется подключить. Инструкция подключения должна следовать непосредственно за заголовком программы, либо после ключевого слова &amp;lt;code&amp;gt;INTERFACE&amp;lt;/code&amp;gt;, если подключение производится в модуле.&lt;br /&gt;
&lt;br /&gt;
Модули, подключённые в интерфейсной секции, могут использоваться во всём модуле — и в секции реализации, и в теле. Но секция реализации может иметь собственную инструкцию подключения (она следует за ключевым словом &amp;lt;code&amp;gt;IMPLEMENTATION&amp;lt;/code&amp;gt;), содержащую имена подключаемых модулей, которые отсутствуют в интерфейсной секции, но нужны для секции реализации. Одним из поводов использования отдельного списка подключения для раздела реализации является ситуация, когда два или более модуля используют друг друга. Чтобы не возникали циклические ссылки в объявлениях использования таких модулей, по крайней мере один из них должен подключать другой в секции реализации.&lt;br /&gt;
&lt;br /&gt;
Любые объявленные в интерфейсных секциях модулей объекты можно использовать в программе там, где эти модули подключены. Имена импортированных из подключённых модулей объектов остаются теми же самыми, и их можно использовать непосредственно. Если два или более подключённых модуля имеют объекты, называемые одинаково, и компилятор не может их различить, то при попытке использования такого объекта будет выдана ошибка компиляции — неоднозначное задание имени. В этом случае программист должен применять квалификацию имени — указать имя в формате «&amp;amp;lt;имя_модуля&amp;amp;gt;.&amp;amp;lt;имя_объекта&amp;amp;gt;».&lt;br /&gt;
&lt;br /&gt;
Проблемы могут возникнуть, если появляется необходимость использования в программе двух разных одноимённых модулей. Если модули доступны только в откомпилированном виде (то есть поменять их имена невозможно), оказывается невозможным их одновременный импорт. Стандартного решения такой коллизии на уровне языка не существует, но конкретные компиляторы могут предлагать те или иные способы её обхода, в частности, средства назначения псевдонимов импортируемым модулям и прямого указания, какой модуль из какого файла брать.&lt;br /&gt;
&lt;br /&gt;
==== Компиляция и компоновка ====&lt;br /&gt;
Модули спроектированы в расчёте на обеспечение раздельной компиляции — компилятор не должен компилировать импортированные модули для того, чтобы откомпилировать модуль, который их использует. Однако, чтобы правильно компилировать модуль, компилятор должен иметь доступ к секции интерфейса всех используемых им модулей. Существует два разных, иногда совмещаемых подхода к организации такого доступа.&lt;br /&gt;
* Модули компилируются в бинарные файлы специального формата (у каждого компилятора своего), в которых сохранена подробная информация об объектах, объявленных в интерфейсной секции, также может содержаться созданный при компиляции модуля объектом языке, но использует при этом только интерфейсную секцию модуля. Если библиотечный модуль поставляется в откомпилированном виде (без полных исходных текстов), то вместе с бинарным файлом идёт урезанный файл исходного кода модуля, содержащий только интерфейсную секцию. Компилятору этого достаточно, чтобы правильно обрабатывать обращения из использующих модулей, а на этапе сборки программы компоновщик просто включает в программу бинарный файл.&lt;br /&gt;
&lt;br /&gt;
==== Загрузка и выгрузка модулей ====&lt;br /&gt;
Для нормальной работы модуля может потребоваться выполнить некоторые действия до начала его использования: инициализировать переменные, открыть нужные файлы, выделить память или другие ресурсы. Всё это может быть сделано в теле модуля, либо в секции инициализации. Действия, обратные инициализации, делаются в секции финализации.&lt;br /&gt;
&lt;br /&gt;
Порядок инициализации и финализации модулей косвенно определяется порядком объявления в секции uses, но для статически откомпилированных программ (где модуль либо компилируется в один исполняемый файл с главной программой, либо находится в отдельной динамической библиотеке, но загружается на этапе первоначальной загрузки), компилятор всегда гарантирует, что инициализация будет выполнена до момента первого использования модуля. Финализация выполняется при завершении работы программы, после завершения главного модуля, так, что используемые модули финализируются позже, чем использующие их.&lt;br /&gt;
&lt;br /&gt;
В случае динамической загрузки модулей, управляемой самим программистом, инициализаторы выполняются при загрузке, то есть в момент, когда команда загрузки модуля вернула управление, инициализатор его уже выполнен. Финализатор выполняется после выгрузки, обычно — при выполнении команды выгрузки модуля. Если эта команда не вызывается, динамически загруженные модули финализируются так же, как все остальные — при завершении программы.&lt;br /&gt;
&lt;br /&gt;
=== Объектно-ориентированное программирование ===&lt;br /&gt;
В [[Object Pascal]] имеется возможность разрабатывать программы с применением парадигмы [[объектно-ориентированное программирование|объектно-ориентированного программирования]]. Классы задаются с помощью типа &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt;, аналогичного &amp;lt;code&amp;gt;record&amp;lt;/code&amp;gt;, который кроме полей данных может содержать заголовки процедур и [[метод (языки программирования)|методов]]. Имена описываемых методов следуют за именем класса через точку.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;[[Конструктор (объектно-ориентированное программирование)|Конструктор]]&#039;&#039; и &#039;&#039;[[Деструктор (программирование)|деструктор]]&#039;&#039; задаются как обычные процедуры, но вместо идентификатора &amp;lt;code&amp;gt;procedure&amp;lt;/code&amp;gt; задаются ключевые слова &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;destructor&amp;lt;/code&amp;gt;. Соответственно, в отличие от [[C++]]-подобных языков они имеют имя, отличное от имени класса, деструкторов может быть несколько, и они могут иметь параметры (на практике эта возможность используется редко, обычно класс имеет единственный деструктор &amp;lt;code&amp;gt;Destroy&amp;lt;/code&amp;gt;, переопределяющий виртуальный деструктор класса-родителя).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
«Все объекты в Object Pascal (FPC, TP) создаются и уничтожаются динамически, конструктор и деструктор всегда должны вызываться явно.» -&lt;br /&gt;
1. неправда (объекты Object Pascal создаются при объявлении переменной такого типа всегда статически(а динамическое создание — только с помощью оператора new)), а вот Delphi-объекты(при объявлении такой переменной) -как раз динамически(вроде всегда — это надо уточнить)-это разные несовместимые виды объектов&lt;br /&gt;
2. для статических объектов конструктор и деструктор вызываться не должны — это делается на усмотрение программиста- по крайней мере в object-объектах — поэтому там и сделан ручной вызов конструктора и деструктора и множество имён) В Object Pascal реально это необходимо только при использовании virtual-методов(так как именно в конструкторе заполняется таблица виртуальных методов)&lt;br /&gt;
С Delphi объектами вроде так и есть -обязателен явный вызов&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживаются единичное наследование, [[Полиморфизм (программирование)|полиморфизм классов]], механизм [[Таблица виртуальных методов|виртуальных]] методов (слово &amp;lt;code&amp;gt;virtual&amp;lt;/code&amp;gt; после заголовка метода класса). Существуют и динамические методы (в TP описываются путём добавления целого числа после слова &amp;lt;code&amp;gt;virtual&amp;lt;/code&amp;gt; и используются преимущественно для обработки сообщений; в Delphi и FreePascal для этих целей используется слово &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt;, а для создания обычных динамических методов — слово &amp;lt;code&amp;gt;dynamic&amp;lt;/code&amp;gt;), отличающиеся меньшим использованием памяти и меньшей скоростью вызова за счёт отсутствия дублирования динамических методов предков в VMT потомка (однако FreePascal не делает различий между виртуальными и динамическими методами).&lt;br /&gt;
&lt;br /&gt;
В Delphi, FPC реализована [[перегрузка операций]], абстрактные методы, директивы &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;protected&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;published&amp;lt;/code&amp;gt; (по умолчанию члены класса являются &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;):&amp;lt;!-- директивы public private были реализованы ещё в TP --&amp;gt;&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример программы для Pascal&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TbasicO = object&lt;br /&gt;
    procedure writeByte (b:byte); virtual; abstract;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  TtextO =object (TbasicO) {наследует TbasicO, реализует остальные операции вывода на основе writeByte}&lt;br /&gt;
    procedure writeS (s: string); &lt;br /&gt;
    {..}&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  TfileO = object (TbasicO) {класс файлового вывода - реализует операцию вывода как вывод байта в файл}&lt;br /&gt;
    constructor init (n: string);&lt;br /&gt;
    procedure writeByte (b: byte); virtual; &lt;br /&gt;
    destructor closefile;&lt;br /&gt;
  private&lt;br /&gt;
    f: file of byte; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  basicO = ^TbasicO; &lt;br /&gt;
  textO = ^TtextO; &lt;br /&gt;
  fileO = ^TfileO;&lt;br /&gt;
&lt;br /&gt;
   constructor TfileO.init (n: string);&lt;br /&gt;
   begin&lt;br /&gt;
     assign (f, n);&lt;br /&gt;
     rewrite (f)&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   destructor TfileO.closefile;&lt;br /&gt;
   begin&lt;br /&gt;
     close (f)&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure TfileO.writeByte (b: byte);&lt;br /&gt;
   begin&lt;br /&gt;
     write (f, b)&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure TtextO.writeS (s: string); &lt;br /&gt;
   var i: integer;&lt;br /&gt;
   begin&lt;br /&gt;
     for i:=1 to length(s) do &lt;br /&gt;
       writeByte (ord(s[i]))&lt;br /&gt;
   end;&lt;br /&gt;
   {..}&lt;br /&gt;
&lt;br /&gt;
var f: fileO;&lt;br /&gt;
begin&lt;br /&gt;
  new (f, init(&#039;tstobj.txt&#039;)); {выделяет память под объект и вызывает конструктор}&lt;br /&gt;
  textO(f)^.writeS (&#039;text string&#039;);&lt;br /&gt;
  dispose (f, closefile)      {вызывает деструктор и освобождает память объекта}&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
В диалекте Delphi классы могут также конструироваться с помощью слова &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; (причём взаимное наследование с &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt;-классами не допускается) и введены [[Интерфейс (объектно-ориентированное программирование)|интерфейсы]] (&amp;lt;code&amp;gt;interface&amp;lt;/code&amp;gt;) — все методы абстрактные и не могут содержать полей данных.&lt;br /&gt;
&lt;br /&gt;
Все классы (созданные с помощью &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt;) являются наследниками &amp;lt;code&amp;gt;TObject&amp;lt;/code&amp;gt;, все интерфейсы происходят от &amp;lt;code&amp;gt;IUnknown&amp;lt;/code&amp;gt;. Классы, созданные с помощью &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt;, могут реализовывать несколько интерфейсов.&lt;br /&gt;
&lt;br /&gt;
В Delphi интерфейсы были введены для поддержки технологии [[COM+|COM]] фирмы Microsoft.&lt;br /&gt;
&lt;br /&gt;
Классы (&amp;lt;code&amp;gt;Class&amp;lt;/code&amp;gt;) в отличие от обычных классов (&amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;) не нуждаются в явном выделении/освобождении памяти, память под них динамически выделяется конструктором с именем &amp;lt;code&amp;gt;Create&amp;lt;/code&amp;gt;, вызываемым с именем класса, и освобождается при вызове деструктора с именем &amp;lt;code&amp;gt;Destroy&amp;lt;/code&amp;gt; (могут иметь другие имена). Переменная такого класса в отличие от класса &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt; хранит адрес экземпляра класса в памяти, значение &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; используется для указания пустой ссылки, поэтому для освобождения объекта в &amp;lt;code&amp;gt;TObject&amp;lt;/code&amp;gt; определён специальный метод &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;, проверяющий ссылку на &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; и вызывающий виртуальный деструктор &amp;lt;code&amp;gt;Destroy&amp;lt;/code&amp;gt;. Код с использованием таких классов будет выглядеть следующим образом:&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример для Pascal&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Pascal&amp;quot;&amp;gt;&lt;br /&gt;
  q1 := t1.create(9); { конструируем объект(t1 - имя класса) }&lt;br /&gt;
  writeln (q1.InstanceSize);  { вывод размера экземпляра класса }&lt;br /&gt;
  q1.Free; { уничтожение объекта }&lt;br /&gt;
  q1 := nil; { чтобы не происходило повторного вызова деструктора при вызове free }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В модификации ObjectPascal/Delphi/FreePascal в описании классов появляются свойства (property), которые совмещают удобство работы с переменными (роль которых в ООП играют поля) и вызовы методов, которые всегда уведомляют объект об изменении его состояния:&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример программы для Pascal&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TMyObj=class(TObject)&lt;br /&gt;
    FProp:integer;&lt;br /&gt;
    procedure SetProp(AValue:integer);&lt;br /&gt;
    property MyProp:integer read FProp write SetProp;&lt;br /&gt;
  end;&lt;br /&gt;
  procedure TMyObj.SetProp(AValue:integer);&lt;br /&gt;
  begin&lt;br /&gt;
    FProp:=AValue;&lt;br /&gt;
    Writeln(&#039;Somebody has changed MyProp!&#039;);&lt;br /&gt;
  end;&lt;br /&gt;
var MyObj:TMyObj;&lt;br /&gt;
begin&lt;br /&gt;
  MyObj:=TMyObj.Create;&lt;br /&gt;
  MyObj.FProp:=5;&lt;br /&gt;
  MyObj.MyProp:=MyObj.MyProp+6;&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
В первом случае (использование MyObj.FProp) поле объекта было изменено непосредственно, в итоге, методы объекта не будут подозревать, что это поле было ранее изменено; в более сложном случае они могут полагаться на то, что поле неизменно, либо же полю может быть присвоено значение, недопустимое для данного объекта. Во втором случае значение присваивается непосредственно свойству объекта, которое ссылается на вызов метода, корректно обрабатывающего изменение данного поля.&lt;br /&gt;
&lt;br /&gt;
Этот подход удобен, если объект связан с визуальным элементом: непосредственное изменение поля, отвечающего, например, за ширину элемента, никак не отразится на самом визуальном элементе, а объект будет «дезинформирован» относительно реальных размеров элемента. Корректным подходом без использования свойств является разработка методов на получение и установку любого значения поля, но работа с такими методами будет менее удобна, например, вместо последней строки надо было бы написать&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
   MyObj.SetProp(MyObj.GetProp+6);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
причём метод MyObj.GetProp следовало бы написать для унификации доступа.&lt;br /&gt;
&lt;br /&gt;
Большой интерес представляют индексные свойства, которые ведут себя практически так же, как и массивы, заменяя обращение к элементу массива вызовом соответствующего метода.&lt;br /&gt;
&lt;br /&gt;
Тем не менее, свойства не являются «панацеей»: при компиляции обращения к свойствам непосредственно транслируются в вызов методов или прямую работу с полями, поэтому настоящими переменными свойства не являются, в частности, их невозможно передавать в виде var-параметров.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Вирт Н.&lt;br /&gt;
|заглавие = Алгоритмы + структуры данных = программы&lt;br /&gt;
|место = М. |издательство = [[Мир (издательство)|Мир]]&lt;br /&gt;
|год = 1985&lt;br /&gt;
|страниц = 406&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Вирт Н., Йенсен К.&lt;br /&gt;
|заглавие = Паскаль. Руководство для пользователя и описание языка&lt;br /&gt;
|место = М. |издательство = [[Финансы и статистика]]&lt;br /&gt;
|год = 1982&lt;br /&gt;
|страниц = 151&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Грогоно П.&lt;br /&gt;
|заглавие = Программирование на языке Паскаль&lt;br /&gt;
|место = М. |издательство = [[Мир (издательство)|Мир]]&lt;br /&gt;
|год = 1982&lt;br /&gt;
|страниц = 384&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Культин Н. Б. &lt;br /&gt;
|заглавие = Программирование в Turbo Pascal 7.0 и Delphi: 3-е изд., перераб. и доп.&lt;br /&gt;
|место = СПб. |издательство = [[БХВ-Петербург]]&lt;br /&gt;
|год = 2007&lt;br /&gt;
|страниц = 400&lt;br /&gt;
|isbn = 978-5-9775-0109-5&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Культин Н. Б. &lt;br /&gt;
|заглавие = Delphi 6. Программирование на Object Pascal&lt;br /&gt;
|место = СПб. |издательство = [[БХВ-Петербург]]&lt;br /&gt;
|год = 2001&lt;br /&gt;
|страниц = 528&lt;br /&gt;
|isbn = 5-94157-112-7&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Моргун А. Н.&lt;br /&gt;
|заглавие = Программирование на языке Паскаль (Pascal). Основы обработки структур данных&lt;br /&gt;
|место = М. |издательство = [[Диалектика (издательство)|Диалектика]]&lt;br /&gt;
|год = 2005&lt;br /&gt;
|страниц = 576&lt;br /&gt;
|isbn = 5-8459-0935-X&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Перминов О. Н.&lt;br /&gt;
|заглавие = Язык программирования Паскаль : Справочник&lt;br /&gt;
|место = М. |издательство = [[Радио и связь]]&lt;br /&gt;
|год = 1989&lt;br /&gt;
|страниц = 128&lt;br /&gt;
|isbn = 5-256-00311-9&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Рубенкинг Н. Дж. &lt;br /&gt;
|заглавие = Турбо Паскаль для Windows: в 2-х томах. Пер. с англ&lt;br /&gt;
|место = М.|издательство = Мир&lt;br /&gt;
|год = 1993&lt;br /&gt;
}}&lt;br /&gt;
* {{Книга|автор = |заглавие = Языки программирования Ада, Си, Паскаль|ответственный = А. Фьюэр, Н. Джехани|издание = |место = М.|издательство = Радио и Связь|год = 1989|страницы = |страниц = 368|isbn = 5-256-00309-7|оригинал = Comparing and Assessong Programming Languages Ada, C, and Pascal|тираж = 50000|ref = Фьюэр, Джехани}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Стандарты&#039;&#039;&#039;&lt;br /&gt;
* ISO 7185:1983 Programming languages — PASCAL (заменён стандартом ISO 7185:1990)&lt;br /&gt;
* ANSI/IEEE770X3.97-1983&lt;br /&gt;
* ГОСТ 28140-89 Системы обработки информации. Язык программирования ПАСКАЛЬ&lt;br /&gt;
* [http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=13802 ISO 7185:1990 Information technology — Programming languages — Pascal] {{Wayback|url=http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=13802 |date=20121025015116 }}&lt;br /&gt;
* [http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=18237 ISO/IEC 10206:1991 Information technology — Progamming languages — Extended Pascal] {{Wayback|url=http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=18237 |date=20121025024827 }}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.archive.org/web/20141209022915/http://pascal-dev.ru/ Программирование на pascal] — online tutorial (rus)&lt;br /&gt;
{{dmoz|World/Russian/Компьютеры/Программирование/Языки/Pascal/|Паскаль}}&lt;br /&gt;
* &lt;br /&gt;
{{Внешние ссылки}}&lt;br /&gt;
&lt;br /&gt;
{{Pascal}}&lt;br /&gt;
{{Стандарты ISO}}&lt;br /&gt;
{{rq|&lt;br /&gt;
{{нет источников|дата=2022-05-15}}&lt;br /&gt;
{{проверить факты|дата=2022-05-15}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Паскаль|*]]&lt;br /&gt;
[[Категория:Языки программирования семейства Паскаля]]&lt;br /&gt;
[[Категория:Языки программирования для образования]]&lt;br /&gt;
[[Категория:Статьи с примерами кода на Паскале]]&lt;br /&gt;
[[Категория:Языки программирования со статическим распределением памяти]]&lt;/div&gt;</summary>
		<author><name>31.41.59.210</name></author>
	</entry>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=Delphi_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)&amp;diff=991</id>
		<title>Delphi (язык программирования)</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=Delphi_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)&amp;diff=991"/>
		<updated>2026-03-22T08:35:16Z</updated>

		<summary type="html">&lt;p&gt;31.41.59.210: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Значения|Delphi}}&lt;br /&gt;
{{о|языке программирования|интегрированной среде разработки|Delphi (среда разработки)|об2=1}}&lt;br /&gt;
{{Карточка языка программирования&lt;br /&gt;
| name = Delphi&lt;br /&gt;
| логотип =&lt;br /&gt;
| paradigm = [[Императивное программирование|императивный]], [[Структурное программирование|структурированный]], [[Объектно-ориентированное программирование|объектно-ориентированный]], [[Компонентно-ориентированное программирование|компонентно-ориентированный]], [[Высокоуровневый язык программирования|высокоуровневый]]&lt;br /&gt;
| typing = [[статическая типизация|статическая]], [[сильная типизация|сильная]]&lt;br /&gt;
| implementations = Borland/Inprise/Codegear/Embarcadero [[Delphi (среда разработки)|Delphi]]; Borland [[Kylix]]; [[FreePascal]]&lt;br /&gt;
| dialects =&lt;br /&gt;
| year =&lt;br /&gt;
| designer = [[Хейлсберг, Андерс|Андерс Хейлсберг]]&lt;br /&gt;
| latest_release_version = 13.0 Florence&lt;br /&gt;
| latest_release_date = {{start date and age|2025|09|10}}&lt;br /&gt;
| influenced_by = [[Object Pascal]], [[C++]]&lt;br /&gt;
| influenced = [[C Sharp|C#]], [[Java]][https://web.archive.org/web/20120627043929/http://java.sun.com/docs/white/delegates.html]&lt;br /&gt;
| operating_system = [[Microsoft Windows]]&lt;br /&gt;
| license =&lt;br /&gt;
| website = https://www.embarcadero.com/ru/products/delphi&lt;br /&gt;
| платформа = x86, x64, ARM&lt;br /&gt;
| операционная система = [[Windows]], [[Linux]], [[Android]], [[macOS]], [[iOS]]&lt;br /&gt;
| extension = .pas, .dpr, .dpk, .pp, .dproj, .dfm, .fmx, .bpl&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Delphi&#039;&#039;&#039; (Де́лфи, произносится {{IPA|/ˈdɘlˌfi:/}}&amp;lt;ref&amp;gt;В [[Великобритания|Великобритании]] доминирует произношение «дел-фи́»: {{cite web&lt;br /&gt;
 |url         = http://cougar.eb.com/sound/gg/ggdelp02.wav&lt;br /&gt;
 |title       = вариант произношения, характерный для Великобритании&lt;br /&gt;
 |work        = Merriam-Webster Online Dictionary&lt;br /&gt;
 |publisher   = Merriam-Webster&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |access-date  = 2008-10-01&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/616XNHJAJ?url=http://cougar.eb.com/sound/gg/ggdelp02.wav&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 |url-status     = dead&lt;br /&gt;
}}, а в [[США]] — «де́л-фай»: {{cite web&lt;br /&gt;
 |url         = http://cougar.eb.com/sound/gg/ggdelp01.wav&lt;br /&gt;
 |title       = вариант произношения, характерный для США&lt;br /&gt;
 |work        = Merriam-Webster Online Dictionary&lt;br /&gt;
 |publisher   = Merriam-Webster&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |access-date  = 2008-10-01&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/616XNiHf4?url=http://cougar.eb.com/sound/gg/ggdelp01.wav&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 |url-status     = dead&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;) — [[Императивное программирование|императивный,]] [[Структурное программирование|структурированный]], [[Объектно-ориентированное программирование|объектно-ориентированный]], [[Высокоуровневый язык программирования|высокоуровневый]] [[язык программирования]] со [[Сильная и слабая типизация|строгой]] [[Статическая типизация|статической типизацией]] переменных. Основная область использования — написание прикладного программного обеспечения.&lt;br /&gt;
&lt;br /&gt;
Этот язык программирования является [[Диалект (программирование)|диалектом]] языка [[Object Pascal]]. Изначально язык Object Pascal относился к несколько другому языку, который был разработан в фирме [[Apple]] в 1986 году группой [[Ларри Теслер]]а&amp;lt;ref&amp;gt;{{cite web |url=https://archive.org/stream/Mac_History_Pascal_DTC/Mac_History_Pascal_DTC_djvu.txt|title=Apple Lisa Computer: History of Apple and Pascal|author=David T. Craig}}&amp;lt;/ref&amp;gt;. Однако, начиная с Delphi 7&amp;lt;ref&amp;gt;[http://docs.codegear.com/docs/radstudio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devcommon/overview_xml.html Delphi Language Overview]{{Недоступная ссылка|date=2018-01|bot=InternetArchiveBot }}&amp;lt;/ref&amp;gt;, в официальных документах компании [[Borland]] название Delphi стало использоваться для обозначения языка, ранее известного как [[Object Pascal]].&lt;br /&gt;
&lt;br /&gt;
== Целевая платформа ==&lt;br /&gt;
Изначально среда разработки Delphi была предназначена исключительно для разработки приложений Microsoft [[Windows]], затем был реализован вариант для платформ [[Linux]] (под торговой маркой [[Kylix]]), однако после выпуска в 2002 году Kylix 3 его разработка была прекращена, и вскоре было объявлено о поддержке [[Microsoft .NET]], которая, в свою очередь, была прекращена с выходом Delphi 2007. &lt;br /&gt;
&lt;br /&gt;
В настоящее время, наряду с поддержкой разработки 32 и 64-разрядных программ для Windows, реализована возможность создавать приложения для [[Apple]] [[macOS]] (начиная с Embarcadero Delphi XE2), [[iOS]] (включая симулятор, начиная с XE4 посредством собственного компилятора), [[Google (компания)|Google]] [[Android]] (начиная с Delphi XE5)&amp;lt;ref&amp;gt;непосредственно исполняемые на [[ARM (архитектура)|ARM]]-процессоре)&amp;lt;/ref&amp;gt;, а также [[Linux]] Server x64 (начиная с версии 10.2 Tokyo).&lt;br /&gt;
&lt;br /&gt;
Независимая, сторонняя реализация среды разработки проектом [[Lazarus]] ([[Free Pascal]], в случае компиляции в режиме совместимости с Delphi) позволяет использовать его для создания приложений на Delphi для таких платформ, как [[Linux]], [[macOS]] и [[Windows CE]].&lt;br /&gt;
&lt;br /&gt;
Также предпринимались попытки использования языка в проектах [[GNU]] (например, [[Notepad GNU]]) и написания компилятора для [[GCC]] ([[GNU Pascal]]).&lt;br /&gt;
&lt;br /&gt;
Используется для написания интернет сервисов IIS.&lt;br /&gt;
&lt;br /&gt;
== Философия и отличия от популярных прикладных языков программирования ==&lt;br /&gt;
При создании языка (и здесь качественное отличие от [[Си (язык программирования)|языка C]]) не ставилось задачи обеспечить максимальную производительность исполняемого кода или лаконичность исходного кода для экономии оперативной памяти. Изначально язык ставил во главу угла стройность и высокую читаемость, поскольку был предназначен для обучения дисциплине программирования. Эта изначальная стройность в дальнейшем, как по мере роста аппаратных мощностей, так и в результате появления новых парадигм, упростила расширение языка новыми конструкциями.&lt;br /&gt;
&lt;br /&gt;
Так, сложность объектного [[C++]], по сравнению с Си, выросла весьма существенно и затруднила его изучение в качестве первого языка программирования, чего нельзя сказать об [[Object Pascal]] относительно [[Паскаль (язык программирования)|Pascal]].&lt;br /&gt;
&lt;br /&gt;
Ниже перечислены некоторые отличия синтаксических конструкций Delphi от семейства C-подобных языков (C/C++/[[Java]]/[[C Sharp|C#]]):&lt;br /&gt;
* В Delphi формальное начало любой программы чётко отличается от других участков кода и должно располагаться в определённом, единственном в рамках проекта, исходном файле с расширением &amp;lt;code&amp;gt;dpr&amp;lt;/code&amp;gt; (тогда как другие файлы исходных текстов программы имеют расширение pas).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;program Project32;&lt;br /&gt;
&lt;br /&gt;
{$APPTYPE CONSOLE}&lt;br /&gt;
&lt;br /&gt;
{$R *.res}&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
  System.SysUtils;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  try&lt;br /&gt;
    { TODO -oUser -cConsole Main: Insert code here }&lt;br /&gt;
  except&lt;br /&gt;
    on E: Exception do&lt;br /&gt;
      Writeln(E.ClassName, &#039;: &#039;, E.Message);&lt;br /&gt;
  end;&lt;br /&gt;
end.&amp;lt;/source&amp;gt;&lt;br /&gt;
: В С-подобных языках программирования в качестве входа обычно используется глобальная функция или статический метод с именем &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; и определённым списком параметров, причём такая функция может быть расположена в любом из файлов исходного текста проекта.&lt;br /&gt;
* В Delphi идентификаторы типов, переменных, а равно и ключевые слова читаются &#039;&#039;независимо&#039;&#039; от регистра: например, идентификатор &amp;lt;code&amp;gt;SomeVar&amp;lt;/code&amp;gt; полностью эквивалентен &amp;lt;code&amp;gt;somevar&amp;lt;/code&amp;gt;. Регистро-зависимые идентификаторы в начале компьютерной эпохи ускоряли процесс компиляции, и кроме того, позволяли использовать очень короткие имена, порой отличающиеся лишь регистром. И хотя к настоящему времени обе эти практики — использование нескольких идентификаторов, различающихся лишь регистром, равно как и чрезмерная их лаконичность, — осуждены и не рекомендованы к применению, практически все унаследованные от [[Си (язык программирования)|С]] языки ([[C++]], [[Java]], [[C Sharp|C#]]) являются &#039;&#039;регистро-зависимыми&#039;&#039;, что, с одной стороны, требует достаточно большой внимательности к объявлению и использованию идентификаторов, а с другой — принуждает писать более строгий код, когда каждая переменная имеет чётко определённое имя (вариации регистра могут вызвать путаницу и ошибки).&lt;br /&gt;
&lt;br /&gt;
* В Delphi в исходных файлах &amp;lt;code&amp;gt;.pas&amp;lt;/code&amp;gt; (которые, как правило, и содержат основное тело программы) на уровне языковых средств введено строгое разделение на [[Интерфейс (объектно-ориентированное программирование)|интерфейсный]] раздел и раздел реализации. В интерфейсной части содержатся лишь объявления типов и методов, тогда как код реализации в интерфейсной части не допускается на уровне компиляции. Подобное разделение свойственно также языкам C, C++ или [[Rust (язык программирования)|Rust]], где в рамках культуры и парадигмы программирования вводится разделение на заголовочные и собственно файлы реализации, но подобное разделение не обеспечивается на уровне языка или компилятора. В C# же или Java такое разделение утрачено вовсе — реализация метода, как правило, следует сразу же после его объявления. Инкапсуляция обеспечивается лишь принадлежностью метода к той или иной области видимости. Для просмотра одной только интерфейсной части модуля исходного кода используются специальные средства.&lt;br /&gt;
&lt;br /&gt;
* В Delphi метод или функция чётко определяются зарезервированными для этого ключевыми словами &amp;lt;code&amp;gt;procedure&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, тогда как в C-подобных языках различие обуславливается типом возвращаемого значения: &amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
//Delphi&lt;br /&gt;
procedure DoSomething (aParam: Integer); //не возвращает значения&lt;br /&gt;
function Calculate (aParam1, aParam2: Integer): Integer; //возвращает целочисленный результат&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
//C#&lt;br /&gt;
void DoSomething(int aParam); // не возвращает значения&lt;br /&gt;
{&lt;br /&gt;
// code&lt;br /&gt;
}&lt;br /&gt;
int Calculate(int aParam1, aParam2); // возвращает целочисленный результат&lt;br /&gt;
{&lt;br /&gt;
// code&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: Тем сложнее в C, C++ и С# выглядят такие конструкции, как объявление типа «[[Указатель (тип данных)|указатель]] на метод»: &amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
//C++: объявление типа pCalc, указателя на функцию-член, принимающую два целочисленных параметра и возвращающую целочисленный результат&lt;br /&gt;
typedef int (TSomeClass::*pCalc)(int, int);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: В вышеуказанном примере объявление типа отличается от объявления переменной ключевым словом &amp;lt;code&amp;gt;typedef&amp;lt;/code&amp;gt;. Имя типа, &amp;lt;code&amp;gt;pCalc&amp;lt;/code&amp;gt;, указывается в середине выражения, в скобках. &amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
//C#: объявление типа pCalc, указателя на функцию-член, принимающую два целочисленных параметра и возвращающую целочисленный результат&lt;br /&gt;
public delegate int pCalc(int aParam1, int aParam2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: В вышеуказанном примере объявление типа отличается от объявления переменной специальным ключевым словом &amp;lt;code&amp;gt;delegate&amp;lt;/code&amp;gt;, имя типа указывается в середине выражения. &amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
//Delphi&lt;br /&gt;
type pCalc = function(aParam1, aParam2: Integer): Integer of object;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: В вышеуказанном примере объявление типа отличается от объявления переменной специальным ключевым словом &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;, применением знака равенства (в случае переменной используется двоеточие), имя типа идёт сразу после ключевого слова.&lt;br /&gt;
&lt;br /&gt;
* В Delphi начало и конец [[Область видимости|программного блока]] выделяются ключевыми словами &amp;lt;code&amp;gt;begin&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt;, тогда как в C-подобных языках программирования для этих целей используются фигурные скобки. Таким образом, возможно, в Delphi достигается лучшая читаемость кода для лиц с ослабленным зрением. С другой стороны, фигурные скобки могут быть более интуитивными при визуальном восприятии, выполняя функцию [[Пиктограмма|пиктограммы]]. &amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
//C#&lt;br /&gt;
if (bVal) {&lt;br /&gt;
//код, состоящий из нескольких инструкций&lt;br /&gt;
}&lt;br /&gt;
if (bVal2) /* код, состоящий из одной инструкции */;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: В вышеуказанном примере фигурные скобки обозначают составную инструкцию, то есть блок инструкций. Поскольку в команде [[Оператор ветвления|ветвления]] для одной инструкции допускается выражение без &#039;&#039;фигурных&#039;&#039; скобок, то для условного выражения &#039;&#039;круглые&#039;&#039; скобки &#039;&#039;обязательны&#039;&#039;. В сложных условных выражениях количество вложенных скобочных конструкций может быть велико. &amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
//Delphi&lt;br /&gt;
if bVal then begin&lt;br /&gt;
// код, состоящий из нескольких инструкций&lt;br /&gt;
end;&lt;br /&gt;
if bVal2 then (* код, состоящий из одной инструкции *);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: В Delphi условное выражение всегда отделяется от следующей инструкции ключевым словом &amp;lt;code&amp;gt;then&amp;lt;/code&amp;gt;, что избавляет от необходимости заключать условие в круглые скобки.&lt;br /&gt;
* В C-подобных языках в целях подобного отделения условное выражение [[Цикл (программирование)|цикла]] заключается в круглые скобки: &amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
while (condition) { // цикл с &amp;quot;предусловием&amp;quot;&lt;br /&gt;
// тело цикла&lt;br /&gt;
};&lt;br /&gt;
do {&lt;br /&gt;
// тело другого цикла&lt;br /&gt;
} while (condition2); // конец цикла с &amp;quot;постусловием&amp;quot;, тело выполняется хотя бы однажды&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: В Delphi циклы с [[Цикл (программирование)#Цикл с предусловием|предусловием]] и [[Цикл (программирование)#Цикл с постусловием|постусловием]] различаются сильнее: &#039;&#039;конец&#039;&#039; цикла с постусловием труднее принять за &#039;&#039;начало&#039;&#039; цикла с предусловием. Но порой такое различие может вызвать путаницу (необходимо помнить, что в цикле &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; указывается условие &#039;&#039;выхода&#039;&#039;). &amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
while condition do begin//условием продолжения цикла является истинность выражения, следующего за словом while, как C/C#&lt;br /&gt;
//тело цикла&lt;br /&gt;
end;&lt;br /&gt;
repeat//начало цикла с постусловием&lt;br /&gt;
//тело цикла&lt;br /&gt;
until not condition2;//истинность выражения, следующего за словом until - это условие ВЫХОДА из цикла, в отличие от C/C#&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* В Delphi операция присвоения значения переменной обозначается при помощи двоеточия со знаком равенства, &amp;lt;code&amp;gt;:=&amp;lt;/code&amp;gt;, что является заимствованием из математической нотации. Знак равенства без двоеточия — это оператор проверки равенства, возвращающий [[Логическое выражение|булево значение]]. Напротив, в C-подобных языках оператором присваивания является одинарный знак равенства, а оператором проверки равенства — двойной, &amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt;. В силу того, что в этих языках программирования присваивание является лишь выражением, возвращающим значение переменной слева, не так уж редки следующие неочевидные для новичка ошибки: &amp;lt;source lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
int iVal = 12;&lt;br /&gt;
while (iVal = 1) {&lt;br /&gt;
// по замыслу программиста, данное тело цикла не должно выполняться, если на входе iVal имеет значение, отличное от единицы&lt;br /&gt;
// однако, в результате ошибочной замены знака == на одиночный =, iVal будет присвоено значение 1, а цикл окажется бесконечным&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: В Delphi подобная ошибка невозможна хотя бы уже потому, что присваивание в этом языке — операция, не возвращающая значения.&lt;br /&gt;
* В Delphi [[объектно-ориентированное программирование]] хоть и поощряется, однако не является единственно возможным. Так, допустимо (в отличие от [[C Sharp|C#]]) объявление и использование глобальных или статических функций и переменных.&lt;br /&gt;
: Язык C# принудительно объектен, а глобальные, без привязки к классу, функции запрещены. Типы, передающиеся в функции по значению, наподобие структур &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;, унаследованы от общего типа C#, несмотря на то, что сами по себе они не могут быть унаследованы (то есть, наследование структур в C# запрещено). Вместе с тем, экземпляры классов C# являются неявно-ссылочными типами, как и в Delphi.&lt;br /&gt;
&lt;br /&gt;
: Поскольку системные вызовы в [[Windows]] (как, впрочем, и в [[POSIX|POSIX-системах]] наподобие [[Linux]], [[MacOS|Mac OS]]) формально необъектны, взаимодействие C#-кода с ними затруднено даже без учёта разной парадигмы управления временем жизни переменных в памяти. Delphi не имеет подобных ограничений. Несмотря на такую акцентированную на объектность парадигму, в C# отсутствует понятие [[Виртуальный метод|виртуального конструктора]], то есть создания экземпляра класса, точный тип которого на этапе компиляции неизвестен, а известен лишь базовый класс этого экземпляра. Отчасти, этот недостаток может быть скомпенсирован посредством [[Интерфейс (объектно-ориентированное программирование)|интерфейсов]] или [[Рефлексия (программирование)|рефлексией]], однако подобные решения не являются стандартными для языка.&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TAnimal = class abstract&lt;br /&gt;
  protected&lt;br /&gt;
    FPersonalName: string;&lt;br /&gt;
  public&lt;br /&gt;
    constructor Create(const PersonalName: string); virtual; abstract;&lt;br /&gt;
    function GetSpecieName: string; virtual; abstract; // возвращает биологический вид животного&lt;br /&gt;
    property Name: string read FPersonalName;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  TAnimalClass = class of TAnimal; // метакласс, могущий ссылаться на любой класс, унаследованный от TAnimal&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
function CreateAnAnimal(const FactAnimalClass: TAnimalClass; const Name: string): TAnimal;&lt;br /&gt;
begin&lt;br /&gt;
  Result := FactAnimalClass.Create(Name); // функция не знает, животное какого именно вида будет создано, хотя &amp;quot;кличка&amp;quot; известна. Конкретная реализация вида скрыта.&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: Кроме того, в отличие от C# и [[C++]], где вызов конструктора базового класса непременно осуществляется ещё до входа в тело конструктора унаследованного класса, в Delphi этот вызов делается явно. Таким образом, его можно отложить или вовсе опустить в специальных целях. Очевидно, в отличие от C#, возможен контроль над [[Обработка исключений|исключениями]] в базовых конструкторах.&lt;br /&gt;
* Для наиболее гибкой и эффективной реализации объектно-ориентированного подхода в Delphi введены два механизма [[Полиморфизм (информатика)|полиморфного]] вызова: классический виртуальный, а также &#039;&#039;динамический&#039;&#039;. Если в случае классического виртуального вызова адреса всех [[Виртуальный метод|виртуальных функций]] будут содержаться в [[Таблица виртуальных методов|таблице виртуальных методов]] каждого класса, то в случае с динамическим вызовом указатель на метод существует лишь в таблице того класса, в котором он был задан или перекрыт. Таким образом, для динамического вызова из класса D метода класса A, переопределённого в B, потребуется выполнить поиск в таблицах методов классов D, A и B. Подобная оптимизация имеет своей целью уменьшение размера статической памяти, занимаемой под таблицы методов. Экономия может быть существенна для длинных иерархий классов с очень большим количеством виртуальных методов. В C-подобных языках динамические полиморфные вызовы не применяются.&lt;br /&gt;
&lt;br /&gt;
* В отличие от C#, язык Delphi допускает создание (инициализацию) экземпляра класса, содержащего [[Абстрактный метод|абстрактные]] (не имеющие реализации) методы. Чтобы исключить возможность создания экземпляра класса, не достаточно объявить в нём абстрактные методы. Необходимо использовать в описании класса ключевое слово &amp;lt;code&amp;gt;abstract&amp;lt;/code&amp;gt;. Таким образом, в настоящее время классы, имеющие абстрактные методы (в отличие от ранних реализаций Delphi), не считаются абстрактными. При помощи механизма виртуальных функций код базового класса, имеющего абстрактные методы, определяет на этапе выполнения, перекрыт ли в фактическом экземпляре класса конкретный абстрактный метод, и в зависимости от этого или вызывает перекрытый метод, или создаёт исключение &amp;lt;code&amp;gt;EAbstractError&amp;lt;/code&amp;gt;. Также Delphi допускает перекрытие любого &#039;&#039;конкретного&#039;&#039; виртуального метода базового класса &#039;&#039;абстрактным&#039;&#039; в классе-потомке:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
TMyBase = class(TObject)&lt;br /&gt;
  function A: integer; virtual; // метод A имеет реализованное тело в разделе implementation&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
TMyDerived = class(TMyBase)&lt;br /&gt;
  function A: integer; override; abstract; // метод перекрыт как абстрактный, тела не имеет,&lt;br /&gt;
// и при этом перекрывает (скрывает) реализованный в базовом классе&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Test;&lt;br /&gt;
var m: TMyBase;&lt;br /&gt;
begin&lt;br /&gt;
  m := TMyDerived.Create; // мы создали класс с абстрактным методом&lt;br /&gt;
  m.A; // вызов A полиморфный, и мы получаем исключение типа EAbstractError, пытаясь выполнить абстрактный метод&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* В отличие от [[C++]], язык C# обладает унаследованной от Delphi концепцией свойств класса — псевдополей, которые в ряде случаев могут более интуитивно, по сравнению с методами, отражать, а также изменять состояние объекта. &amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public class Date{//данный пример взят с [http://msdn.microsoft.com/en-us/library/w86s7x04.aspx msdn]&lt;br /&gt;
    private int month = 7;  // Backing store&lt;br /&gt;
&lt;br /&gt;
    public int Month{&lt;br /&gt;
        get{ return month; }&lt;br /&gt;
        set{&lt;br /&gt;
            if ((value &amp;gt; 0) &amp;amp;&amp;amp; (value &amp;lt; 13)) {&lt;br /&gt;
                month = value;&lt;br /&gt;
            }&lt;br /&gt;
        }//set&lt;br /&gt;
    }//prop&lt;br /&gt;
}//class&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Аналогичный исходный текст на языке Delphi может выглядеть следующим образом: &amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TDate = class&lt;br /&gt;
  private&lt;br /&gt;
    FMonth : Integer;&lt;br /&gt;
  protected&lt;br /&gt;
    procedure SetMonth(const Value: Integer); // реализация в разделе implementation&lt;br /&gt;
  public&lt;br /&gt;
    property Month: Integer read FMonth write SetMonth;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: Если в Delphi возможна привязка свойства к значению поля, то в C# они всегда снабжаются методами доступа с использованием скобок составной команды (кроме автоматических свойств). Методы эти, в отличие от Delphi, не могут быть объявлены виртуальными, равно как не могут быть вызваны непосредственно. Метод доступа в C# всегда относится к одному, и только к одному свойству, тогда как для Delphi это утверждение, вообще говоря, неверно. Более того, один и тот же метод может быть использован для реализации доступа к существенно различным свойствам:&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TRectangle = class&lt;br /&gt;
  private&lt;br /&gt;
    FCoordinates: array[0..3] of Longint;&lt;br /&gt;
    function GetCoordinate(Index: Integer): Longint;&lt;br /&gt;
    procedure SetCoordinate(Index: Integer; Value: Longint);&lt;br /&gt;
  public&lt;br /&gt;
    property Left: Longint index 0 read GetCoordinate write SetCoordinate;&lt;br /&gt;
    property Top: Longint index 1 read GetCoordinate write SetCoordinate;&lt;br /&gt;
    property Right: Longint index 2 read GetCoordinate write SetCoordinate;&lt;br /&gt;
    property Bottom: Longint index 3 read GetCoordinate write SetCoordinate;&lt;br /&gt;
&lt;br /&gt;
    property Coordinates[Index: Integer]: Longint read GetCoordinate write SetCoordinate;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Как Delphi, так и C# допускают использование индексируемых свойств (индексаторов), в этом случае синтаксис доступа к такому свойству аналогичен доступу к элементу массива. Однако, если в Delphi число индексируемых свойств, равно как и число индексаторов, может быть произвольным, в C# индексатор применим лишь к специальному свойству по умолчанию. Кроме того, в Delphi свойство по умолчанию не только может быть индексируемым, также оно может быть перегружено по типу индексатора: &amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
TMyObject = class&lt;br /&gt;
protected&lt;br /&gt;
  function getStr(Name: string): string; virtual;&lt;br /&gt;
  function getStrByIx(Index: Integer): string; virtual;&lt;br /&gt;
  function getBy2Indicies(X, Y: Integer): string; virtual;&lt;br /&gt;
public&lt;br /&gt;
  property Value[Name: string]: string  read getStr; default;&lt;br /&gt;
  property Value[Index: Integer]: string read getStrByIx; default;&lt;br /&gt;
  property Value[X, Y: Integer]: string read getBy2Indicies; default; //количество&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Языки [[Java]] и C# были изначально спроектированы для создания программ, работающих в управляемой среде, где управлением временем жизни объектов занимается эта среда, поэтому ручное управление памятью не допускается. Удобство и безопасность этого подхода отрицательно влияют на производительность.&lt;br /&gt;
{{Начало скрытого блока|Заголовок =Преимущества и недостатки сборки мусора|Выравнивание_заголовка=left|Фон_заголовка=Azure}}&lt;br /&gt;
Платформы .NET и Java значительно упростили разработку программ за счёт введения «сборщика мусора», который разрешает программисту не заботиться о высвобождении памяти, занимаемой объектами, которые вышли из области видимости работающего кода программы. Это, с &#039;&#039;одной&#039;&#039; стороны, значительно уменьшило проблему так называемых «утечек памяти» (когда уже ненужные, — и недостижимые по причине утраты адреса данные занимают оперативную память), но, с &#039;&#039;другой&#039;&#039; стороны, потребовало от платформы реализовать сложный и ресурсоёмкий алгоритм «сборки мусора» — который традиционно реализован как нахождение достижимых объектов и высвобождение остальных. На практике, чтобы выполнить &#039;&#039;исчерпывающий&#039;&#039; анализ достижимости объектов, сборщик мусора в некоторые моменты времени приостанавливает работу программы (всех её потоков), что приводит к кратковременной потере отзывчивости. Частота и длительность таких остановок напрямую зависит от объёма доступной оперативной памяти (пока есть свободная память, сборщик мусора старается не проводить блокирующий анализ), а также от числа задействованных в программе объектов (таким образом, лучше иметь несколько «больших» объектов, чем много — маленьких).&lt;br /&gt;
&lt;br /&gt;
Ситуация ухудшается по мере роста количества задействованных в программе потоков — ведь исчерпывающий анализ достижимости требует полного останова. Таким образом, явная выгода — решение проблемы «утечек памяти» и, в целом, автоматическое управление временем жизни объектов — породила &#039;&#039;неявную&#039;&#039; проблему масштабирования и «провалов» производительности. Эта проблема малозаметна в простых программах, но по мере роста сложности и объёма кодовой базы становится всё более острой — то есть на финальном этапе разработки. Сложные программные комплексы, как правило, имеют привязку к реальному времени, так и требования к отзывчивости.&lt;br /&gt;
{{цитата|автор=[https://habrahabr.ru/post/188580 Drew Crawford — Почему веб-приложения на мобильных платформах работают медленно ]|Точнее, когда у сборщика мусора есть в 5 раз больше памяти, чем требуется, его производительность совпадает или слегка превосходит прямое управление памятью. Однако, производительность сборщика мусора быстро деградирует, когда ему требуется работать с небольшими хипами. С 3&amp;lt;!-- -мя --&amp;gt; размерами требуемой памяти он, в среднем, работает на 17 % медленнее, а с двумя размерами — на 70 % медленнее. Также сборщик мусора более подвержен пейджингу, если память дефрагментирована. В подобных условиях, все протестированные нами сборщики мусора работают на порядок медленнее прямого управления памятью.}}&lt;br /&gt;
{{Конец скрытого блока}}&lt;br /&gt;
&lt;br /&gt;
Попытки снизить издержки сборки мусора могут привести к существенному искажению стиля программирования&amp;lt;ref&amp;gt;{{YouTube|mB4TKsIz5Sk|Дмитрий Иванов — Сказки о преждевременной оптимизации|start=2140}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{YouTube|Q-7y1u9kZV0|Роман Елизаров — Миллионы котировок в секунду на чистой Java|start=3539}}&amp;lt;/ref&amp;gt;. В Delphi не существует автоматического управления памятью: (в &#039;&#039;классических&#039;&#039; компиляторах языка) экземпляры классов создаются и удаляются вручную, тогда как для некоторых типов — интерфейсов, строк и динамических массивов — задействован механизм подсчёта ссылок. Ни один из этих подходов, вообще говоря, не гарантирует отсутствия [[Утечка памяти|утечек памяти]], но, с другой стороны, проблема отзывчивости неактуальна, временные издержки управления памяти малы, и, что важнее, очевидны. Также, при отсутствии утечек общий объём задействованной оперативной памяти существенно меньше, чем у аналогичных приложений, полагающихся на сборщик мусора.&lt;br /&gt;
&lt;br /&gt;
== История языка ==&lt;br /&gt;
Object Pascal — результат развития языка [[Турбо Паскаль]], который, в свою очередь, развился из языка [[Паскаль (язык программирования)|Паскаль]]. Паскаль был полностью [[процедурный язык программирования|процедурным языком]], Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а в Object Pascal — динамическую идентификацию типа данных с возможностью доступа к метаданным классов (то есть к описанию классов и их членов) в компилируемом коде, также называемую [[Интроспекция (программирование)|интроспекцией]] — данная технология получила обозначение [[RTTI]]. Так как все классы наследуют функции базового класса TObject, то любой указатель на объект можно преобразовать к нему, после чего воспользоваться методом ClassType и функцией TypeInfo, которые и обеспечат интроспекцию.&lt;br /&gt;
&lt;br /&gt;
Также отличительным свойством Object Pascal от C++ является то, что объекты по умолчанию располагаются в динамической памяти. Однако можно переопределить виртуальные методы NewInstance и FreeInstance класса TObject. Таким образом, абсолютно любой класс может осуществить «желание» «где хочу — там и буду лежать». Соответственно организуется и «многокучность».&lt;br /&gt;
&lt;br /&gt;
Object Pascal (Delphi) является результатом функционального расширения Turbo Pascal&amp;lt;ref&amp;gt;Об этом говорят обозначения версий компилятора. Так, в Delphi 7 компилятор имеет номер версии 15.0 (последняя версия Borland Pascal / Turbo Pascal обозначалась 7.0, в Delphi 1 компилятор имеет версию 8.0, в Delphi 2 — 9.0 и т. д. Номер версии 11.0 носит компилятор Pascal, входивший в состав среды [[C++ Builder]]).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Многие элементы и концептуальные решения Delphi вошли в состав С#. Одной из причин называют переход [[Хейлсберг, Андерс|Андерса Хейлсберга]], одного из ведущих разработчиков Дельфи, из компании Borland Ltd. в Microsoft Corp.&lt;br /&gt;
* Версия 8 способна генерировать [[байт-код]] исключительно для платформы .NET. Это первая среда, ориентированная на разработку многоязычных приложений (лишь для платформы .NET);&lt;br /&gt;
* Последующие версии (обозначаемые годами выхода, а не порядковыми номерами, как это было ранее) могут создавать как приложения Win32, так и байт-код для платформы .NET.&lt;br /&gt;
&lt;br /&gt;
[[Delphi for .NET]] — [[Интегрированная среда разработки|среда разработки]] Delphi, а также язык Delphi (Object Pascal), ориентированные на разработку приложений для .NET.&lt;br /&gt;
&lt;br /&gt;
Первая версия полноценной среды разработки Delphi для .NET — Delphi 8. Она позволяла писать приложения только для .NET. Delphi 2006 поддерживает технологию MDA с помощью ECO (Enterprise Core Objects) версии 3.0.&lt;br /&gt;
&lt;br /&gt;
В марте 2006 года компания Borland приняла решение о прекращении дальнейшего совершенствования интегрированных сред разработки [[JBuilder]], Delphi и C++ Builder по причине убыточности этого направления. Планировалась продажа IDE-сектора компании. Группа сторонников [[свободное программное обеспечение|свободного программного обеспечения]] организовала сбор средств для покупки у Borland прав на среду разработки и компилятор&amp;lt;ref&amp;gt;[http://opendelphi.org Default Parallels Plesk Panel Page] {{webarchive|url=https://web.archive.org/web/20061205015430/http://opendelphi.org/ |date=2006-12-05 }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Однако в ноябре того же года было принято решение отказаться от продажи IDE-бизнеса. Тем не менее разработкой IDE продуктов теперь будет заниматься новая компания — CodeGear, которая будет финансово полностью подконтрольна Borland.&lt;br /&gt;
&lt;br /&gt;
В августе 2006 года Borland выпустил облегчённую версию RAD Studio под именем Turbo: [[Turbo Delphi]] (для Win32 и .NET), Turbo C#, Turbo C++.&lt;br /&gt;
&lt;br /&gt;
В марте 2008 года было объявлено о прекращении развития этой линейки продуктов.&lt;br /&gt;
&lt;br /&gt;
В марте 2007 года CodeGear порадовала пользователей обновлённой линейкой продуктов Delphi 2007 for Win32 и выходом совершенно нового продукта Delphi 2007 for PHP.&lt;br /&gt;
&lt;br /&gt;
В июне 2007 года CodeGear представила свои планы, то есть опубликовала так называемый «roadmap»&amp;lt;ref&amp;gt;{{Cite web |url=http://dn.codegear.com/article/36620 |title=Delphi and C++Builder Roadmap |access-date=2007-07-18 |archive-date=2007-10-10 |archive-url=https://web.archive.org/web/20071010010158/http://dn.codegear.com/article/36620 |url-status=dead }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Embarcadero RAD Studio 2010.png|200px|thumb|Embarcadero RAD Studio 2010]]&lt;br /&gt;
25 августа 2008 года компания Embarcadero, новый хозяин CodeGear, опубликовала пресс-релиз на Delphi for Win32 2009&amp;lt;ref&amp;gt;{{Cite web |url=http://www.codegear.com/article/38512 |title=Database Tools and Developer Software {{!}} Embarcadero Technologies |access-date=2008-08-25 |archive-date=2008-08-29 |archive-url=https://web.archive.org/web/20080829190209/http://www.codegear.com/article/38512 |url-status=dead }}&amp;lt;/ref&amp;gt;. Версия привнесла множество нововведений в язык, как то&amp;lt;ref&amp;gt;[http://www.codegear.com/products/delphi/win32/whats-new/ Delphi from Embarcadero | RAD Application Development Software] {{webarchive|url=https://web.archive.org/web/20080710075609/http://www.codegear.com/products/delphi/win32/whats-new/ |date=2008-07-10 }}&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* По умолчанию полная поддержка [[Юникод]]а во всех частях языка, VCL и RTL; замена обращений ко всем функциям Windows API на юникодные аналоги (то есть MessageBox вызывает MessageBoxW, а не MessageBoxA).&lt;br /&gt;
* [[Обобщённое программирование|Обобщённые типы]], они же &#039;&#039;&#039;generics&#039;&#039;&#039;.&lt;br /&gt;
* [[Анонимная функция|Анонимные методы]].&lt;br /&gt;
* Новая директива компилятора $POINTERMATH [ON|OFF].&lt;br /&gt;
* Функция Exit теперь может принимать параметры в соответствии с типом функции.&lt;br /&gt;
&lt;br /&gt;
Вышедшая в 2011 году версия Delphi XE2 добавила компилятор [[Win64]] и кросс-компиляцию для операционных систем фирмы [[Apple]] (MacOS X, iOS).&lt;br /&gt;
&lt;br /&gt;
Вышедшая в 2013 году версия Delphi XE5 обеспечила кросс-компиляцию приложений для устройств на платформе ARM/Android.&lt;br /&gt;
&lt;br /&gt;
== Компиляторы ==&lt;br /&gt;
* [[Embarcadero Delphi]] (ранее наз. CodeGear Delphi и Borland Delphi) — вероятно, наиболее известный компилятор, который является последователем [[Borland Pascal]] и [[Turbo Pascal]]. Используется [[Windows API#Versions|Win16]] (Delphi 1), [[Windows API#Versions|Win32]] (Delphi 2 и позже), [[Windows API#Versions|Win64]] (Delphi 16 (XE2) и позже), а также [[.NET Framework|.NET 1.x, 2.0]] (Delphi 8, Delphi 2005-Delphi 2007). Поддержка .NET впоследствии выделена в отдельный продукт, известный как (несовместимый с Delphi) [[Oxygene (язык программирования)|Oxygene]].&lt;br /&gt;
* [[Free Pascal]] (FPC) — [[Свободное программное обеспечение|свободный]] компилятор [[Object Pascal]], который поддерживает различные диалекты Паскаля, включая [[Turbo Pascal]] (с некоторыми оговорками), Delphi и собственные диалекты. На текущий момент FPC может генерировать код для [[x86]], [[x86-64]], [[PowerPC]], [[SPARC]] и процессоров [[ARM (архитектура)|ARM]], а также для различных операционных систем, в том числе для [[Microsoft Windows]], [[Linux]], [[FreeBSD]], [[Mac OS]]. Существует несколько сред разработки программного обеспечения для FPC (одна из самых известных представителей — [[Lazarus]]).&lt;br /&gt;
* [[GNU Pascal]] (отдельно разработанная версия из [[GCC]]). Не ставит целью продолжение серии диалектов Delphi как составляющей Паскаля, но тем не менее содержит режим совместимости с Borland Pascal, и очень медленно приспосабливает компоненты языка Delphi. Не подходит для компиляции больших проектов, содержащих код Delphi, но его поддерживает большинство операционных систем и архитектур.&lt;br /&gt;
* [[Oxygene (язык программирования)|Oxygene]] (ранее известен как &#039;&#039;Chrome&#039;&#039;) — компилятор ограниченно совместимого с Delphi языка, который интегрирован в [[Microsoft Visual Studio]]. Также доступен в виде компилятора с вольной командной строкой [[Common Language Infrastructure|CLI]]. Использует .NET и моноплатформы. Прежде продавался под маркой [[Embarcadero Delphi]] Prism.&lt;br /&gt;
* [[MIDletPascal]] — язык программирования с Delphi-подобным синтаксисом и одноимённый компилятор, который преобразует исходный код в компактный и быстрый [[байт-код Java]].&lt;br /&gt;
* [[PocketStudio]] — основанная на Паскале [[Интегрированная среда разработки|IDE]] для [[Palm OS]].&lt;br /&gt;
* [[Virtual Pascal]] — Бесплатный компилятор и текстовая IDE для Win32, OS/2 и Linux. На тот момент очень быстрый и весьма совместимый (частично поддерживаются конструкции Delphi 5). Внешне очень похож на текстовую среду Borland Pascal 7, хотя отсутствует совместимая с ним графика, например. Однако разработка окончилась в 2004 году, а исходники открыты не были. С тех пор FPC ушёл намного вперёд и в целом для программирования лучше он. Тем не менее VP остаётся очень неплохим вариантом быстрой замены ещё более устаревших версий Borland Pascal для школы/института, учитывая родную работу в Win32 без проблем с русскими кодировками.&lt;br /&gt;
&lt;br /&gt;
== Синтаксис языка ==&lt;br /&gt;
&lt;br /&gt;
=== Система типов ===&lt;br /&gt;
[[Система типов]] в Delphi [[строгая типизация|строгая]], [[статическая типизация|статическая]].&lt;br /&gt;
{{Начало скрытого блока|Заголовок =Краткий перечень поддерживаемых типов|Выравнивание_заголовка=left|Фон_заголовка=Azure}}&lt;br /&gt;
Поддерживаются следующие [[тип данных|типы данных]]:&lt;br /&gt;
* целочисленные, знаковые, и беззнаковые: Byte, Shortint, Word, Smallint, Cardinal,Integer, UInt64, Int64&lt;br /&gt;
* типы-перечисления, задаваемые пользователем&lt;br /&gt;
* вещественные типы Single, Double, Extended (только x86-32, на Win64 Extended = Double), унаследованный тип Real48, работающий в режиме целочисленной эмуляции. Тип &amp;lt;code&amp;gt;Currency&amp;lt;/code&amp;gt; вещественное фиксированной точности.&lt;br /&gt;
* строки. Тип &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; — автоматический распределяемый в памяти, с подсчётом ссылок и парадигмой Copy-On-Write. В поздних версиях Delphi символы двухбайтные, Unicode-совместимые. AnsiString — аналогичная реализация для строк с шириной символа в один байт. Такие строки содержат в служебном поле информацию о кодировке. В Windows компиляторах с ранних версий существует тип &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;, полностью совместимый типу &amp;lt;code&amp;gt;BSTR&amp;lt;/code&amp;gt; в [[Component Object Model]]. Также допускается использование строк с фиксированной длиной, не превышающей 255 однобайтных символов. Допускается использование примитивных строковых типов, в стиле языка C: &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt;&lt;br /&gt;
* массивы. Одномерные, многомерные фиксированной длины, а также подобные им динамические, с подсчётом ссылок.&lt;br /&gt;
* множества, состоящие из элементов типа-перечисления. Максимальный размер такого перечисления — 256 элементов.&lt;br /&gt;
* [[Запись (тип данных)|Записи]]. Структурный (value) тип без поддержки наследования. Начиная с Delphi 2006 добавлена поддержка инкапсуляции, методов, свойств. Перегрузка операторов. Начиная с Delphi 10.3 Rio добавлена возможность создавать для записи конструкторы.&lt;br /&gt;
* Классы и обобщённые классы (generics). Неявно-ссылочный тип. Поддержка инкапсуляции, наследования, полиморфизма, в том числе виртуальных конструкторов, атрибутов, обобщённых параметров для класса и отдельных методов, а также диспетчеризации методов по индексу. Класс может реализовать один или несколько интерфейсов, в том числе опосредованно, делегируя реализацию интерфейса свойству или полю. Множественное наследование не поддерживается.&lt;br /&gt;
* Указатели на функции и методы, а также указатели на анонимные функции.&lt;br /&gt;
* Типы-[[метакласс]]ы, содержащие указатель на тип объекта (но не сам объект). В основном введены для реализации виртуальных конструкторов и автоматической сериализации.&lt;br /&gt;
* интерфейсы. COM-совместимые (в Windows-компиляторе), унаследованные от одного предка. Множественное наследование не поддерживается.&lt;br /&gt;
* Диспинтерфейсы, для работы с интерфейсами IDispatch в режиме позднего связывания.&lt;br /&gt;
* {{iw|Вариантный тип данных|Вариантные типы|en|Variant type}} &amp;lt;code&amp;gt;Variant&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;OleVariant&amp;lt;/code&amp;gt; — тип с динамической типизацией.&lt;br /&gt;
* Старые объекты, поддерживаемые для совместимости с Turbo Pascal. В отличие от экземпляра класса, объект может быть размещён в стеке, или статически. .&lt;br /&gt;
{{Конец скрытого блока}}&lt;br /&gt;
&lt;br /&gt;
=== [[Оператор (программирование)|Операторы]] ===&lt;br /&gt;
Список операторов через пробел: &amp;lt;code&amp;gt;:= &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+ — * / div mod &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;not and or with xor &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;shl shr &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;^ = &amp;lt;&amp;gt; &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;&amp;gt;= &amp;lt;= &amp;lt; &amp;gt; &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;@ in is as&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Начало скрытого блока|Заголовок =Краткий перечень операторов|Выравнивание_заголовка=left|Фон_заголовка=Azure}}&lt;br /&gt;
* Арифметические: &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;—&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;mod&amp;lt;/code&amp;gt; Сложение, вычитание, умножение, деление(дающее вещественный результат), целочисленное деление, выделение остатка.&lt;br /&gt;
По типу возвращаемого значения &#039;&#039;различаются&#039;&#039; операторы целочисленного деления (&amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mod&amp;lt;/code&amp;gt;) и оператор &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. Последний, применяемый как к целочисленным, так и к вещественным операндам, всегда в результате даёт вещественный тип.&lt;br /&gt;
Оператор сложения &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; используется также для конкатенации строк (когда используются встроенные строковые типы).&lt;br /&gt;
* [[Битовые операции|Бинарные]]/логические: &amp;lt;code&amp;gt;not&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;and&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;or&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;xor&amp;lt;/code&amp;gt; Инверсия(отрицание), «И», «ИЛИ», Исключающее «ИЛИ». Тип операции (бинарная или логическая) зависит от типа первого операнда.&lt;br /&gt;
К битовым операторам целочисленных типов относятся также &amp;lt;code&amp;gt;shl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shr&amp;lt;/code&amp;gt; — операторы сдвига, соответствующие по смыслу одноимённым командам процессоров Intel x86.&lt;br /&gt;
&lt;br /&gt;
* Порядковые операторы(операторы сравнения)&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt;&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt;=&amp;lt;/code&amp;gt; — равенства, неравенства(соответствует оператору &amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; в C-подобных языках), больше, меньше, не меньше, не больше — применяются ко всем порядковым и вещественным типам и возвращают значение типа &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt;&lt;br /&gt;
* К операторам множества относятся &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; — сложение, вычитание, пересечение множеств, а также оператор теста вхождения, которые используются для манипуляций со встроенным типом множества. Первые три возвращают тип множества, последний — булевый тип.&lt;br /&gt;
{{Начало скрытого блока|Заголовок =Пример использования оператора in|Выравнивание_заголовка=left|Фон_заголовка=Azure}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TDayOfWeek = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); //задаётся тип перечислений&lt;br /&gt;
  TDays = set of TDayOfWeek; //задаётся тип множества&lt;br /&gt;
var&lt;br /&gt;
  day: TDayOfWeek;&lt;br /&gt;
  days: TDays;&lt;br /&gt;
  isMyDay: Boolean;&lt;br /&gt;
begin&lt;br /&gt;
 days := [Sunday, Tuesday, Saturday];&lt;br /&gt;
 day := Monday;&lt;br /&gt;
 isMyDay := day in days; // оператор in возвращает булевое значение, принимая первым операндом значение типа &amp;quot;элемент множества&amp;quot;, а вторым — значение типа &amp;quot;множество&amp;quot;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Конец скрытого блока}}&lt;br /&gt;
* Операторы приведения типов — &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;as&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;is&amp;lt;/code&amp;gt; — безусловное приведение, безопасное приведение объектных и интерфейсных типов, а также оператор теста принадлежности к типу(возвращает булевое значение). Безусловное(небезопасное) приведение используется в функциональном стиле(слева пишется идентификатор типа, справа в скобках приводимое к нему выражение) и применяется к порядковым, вещественным, структурным, ссылочным, строковым типам. При этом для ссылочных(включая неявно-ссылочные) типов &#039;&#039;&#039;не&#039;&#039;&#039; происходит действительного приведения, а лишь новая интерпретация тех же данных.&lt;br /&gt;
Операторы &amp;lt;code&amp;gt;as&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;is&amp;lt;/code&amp;gt; применяются к типам, допускающим полиморфное поведение — экземплярам класса и интерфейсам. Первый приводит безопасное(в смысле невозможности неверной интерпретации) приведение типа, а второй тестирует поддержку экземпляром класса или интерфейсом некоторого класса или интерфейса. Нужно помнить, что в отличие от языка C# неудавшееся приведение типа оператором &amp;lt;code&amp;gt;as&amp;lt;/code&amp;gt; возбуждает исключение.&lt;br /&gt;
* Ссылочные операторы &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt; — используются для работы с указателями.&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; разыменовывает указатель. Оператор &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt; выполняет обратное действие, возвращая адрес переменной. Поддерживается простые операции сложения и вычитания над типизированными указателями, с учётом размера типов, на которые они указывают (&#039;&#039;умная&#039;&#039; арифметика указателей).&lt;br /&gt;
* Оператор присваивания &amp;lt;code&amp;gt;:=&amp;lt;/code&amp;gt;. В Delphi оператор присваивания, образует не выражение, а операцию, таким образом, не допускается «нанизывание» присваиваний.&lt;br /&gt;
{{Конец скрытого блока}}&lt;br /&gt;
&lt;br /&gt;
=== [[Класс (программирование)|Классы]] ===&lt;br /&gt;
В языке Object Pascal классы — это специальные типы данных, используемые для описания объектов. Соответственно объект, имеющий тип какого-либо класса, является экземпляром (instance) этого класса или переменной этого типа.&lt;br /&gt;
&lt;br /&gt;
Класс представляет собой особый тип, имеющий в своём составе такие элементы, как поля, свойства и методы. Поля класса аналогичны полям записи и служат для хранения информации об объекте. &#039;&#039;Методами&#039;&#039; называются процедуры и функции, предназначенные как правило для обработки полей. &#039;&#039;Свойства&#039;&#039; занимают промежуточное положение между полями и методами.&lt;br /&gt;
&lt;br /&gt;
== Объектно-ориентированные особенности языка ==&lt;br /&gt;
&lt;br /&gt;
=== [[Инкапсуляция (программирование)|Инкапсуляция]] ===&lt;br /&gt;
Объединение и скрытие объектных данных, а также обрабатывающих их методов, внутри конкретного класса от пользователя называется инкапсуляцией.&lt;br /&gt;
&lt;br /&gt;
=== [[Наследование (программирование)|Наследование]] ===&lt;br /&gt;
При создании новых типов объектов способность получить все свойства и методы от своих предков называют наследованием. Такие типы объектов наследуют после своего создания все поля, свойства, события, методы и прочее от своих предков. Наследование часто избавляет разработчиков от рутинной работы и позволяет, не мешкая, приступить к разработке чего-то нового. В отличие от C++, в Delphi не допускается множественное наследование. В Delphi есть возможность добавить методы в класс или запись, с помощью так называемого помощника класса или помощника записи (class helper или record helper), который, не являясь потомком от модифицируемого класса или записи, может добавлять в них дополнительные методы. Примером может служить объявленная в модуле System.SysUtils запись-помощник TStringHelper.&lt;br /&gt;
&lt;br /&gt;
=== [[Полиморфизм (информатика)|Полиморфизм]] ===&lt;br /&gt;
Delphi реализует классическую модель полиморфизма, принятую в &#039;&#039;прикладных&#039;&#039; языках программирования, когда методы базового класса, а также ссылочные переменные типа базового класса,— способны манипулировать экземплярами классов-потомков на основе контракта, заданного в базовом классе. Контрактом в этом случае выступает объявление абстрактных методов в базовом классе.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
&lt;br /&gt;
=== Структура программы ===&lt;br /&gt;
Каждая написанная программа на языке Delphi состоит из заголовка программы (program NewApplication;), поля используемых модулей Uses (к примеру, Uses Windows, Messages, SysUtils и т. д.), который может не входить в саму структуру, а также блоков описания и исполнения (начинаются составным оператором begin и заканчиваются end.).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
program Project1;                     // Заголовок программы, с её именем «Project1»&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
  Forms,&lt;br /&gt;
  Unit1 in &#039;Unit1.pas&#039; {Form1};       // модули, которые подключены к проекту и используются программой&lt;br /&gt;
&lt;br /&gt;
{$R *.res}&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Application.Initialize;                // Инициализация приложения&lt;br /&gt;
  Application.CreateForm(TForm1, Form1); // Создание формы/окна&lt;br /&gt;
  Application.Run;                       // Запуск и исполнение&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример № 1 ===&lt;br /&gt;
Вывод сообщения «Hello, world!» в консольном приложении Delphi&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
program Helloworld;          //название программы&lt;br /&gt;
{$APPTYPE CONSOLE}           //директива компилятору о создании консольного приложения&lt;br /&gt;
begin&lt;br /&gt;
  writeln(&#039;Hello, world!&#039;);    //вывод сообщения Hello, world!&lt;br /&gt;
  readln;                    //ожидание нажатия клавиши пользователем&lt;br /&gt;
end.                         //конец программы&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример № 2 ===&lt;br /&gt;
Вывод сообщения «Hello, world!» в 32-разрядном GUI приложении Delphi&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
procedure TForm1.Button1Click(Sender: TObject); //Обработчик события OnClick, генерируемый автоматически&lt;br /&gt;
begin&lt;br /&gt;
  ShowMessage(&#039;Hello, world!&#039;);                  //вывод сообщения Hello, world!&lt;br /&gt;
end;                                           //конец процедуры&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример № 3 ===&lt;br /&gt;
Динамическое создание списка строк и запись его в файл.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Обработчик события, происходящего при создании формы MainForm&lt;br /&gt;
procedure TMainForm.FormCreate(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
  // Объявление переменной типа TStrings (список строк).&lt;br /&gt;
  Strings: TStrings;&lt;br /&gt;
begin&lt;br /&gt;
  // Создание (выделение памяти и заполнение её начальными значениями) объекта типа TStringList.&lt;br /&gt;
  // TStringList - это потомок TStrings, реализующий его абстрактные методы с целью хранения строк в памяти.&lt;br /&gt;
  Strings := TStringList.Create;&lt;br /&gt;
  try&lt;br /&gt;
    // Добавление строки.&lt;br /&gt;
    Strings.Add(&#039;Добавляемая строка.&#039;);&lt;br /&gt;
    // Сохранение всех строк в файл.&lt;br /&gt;
    Strings.SaveToFile(&#039;C:\Strings.txt&#039;);&lt;br /&gt;
  finally&lt;br /&gt;
    // Освобождение памяти объекта и очистка ссылки на неё для предотвращения непреднамеренного обращения к не выделенной памяти.&lt;br /&gt;
    FreeAndNil(Strings);&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Расширения файлов ==&lt;br /&gt;
* &amp;lt;code&amp;gt;.pas&amp;lt;/code&amp;gt; — исходный код модуля (pascal)&lt;br /&gt;
* &amp;lt;code&amp;gt;.dpr&amp;lt;/code&amp;gt; — исходный код проекта (pascal)&lt;br /&gt;
* &amp;lt;code&amp;gt;.dproj&amp;lt;/code&amp;gt; — исходный код проекта (xml)&lt;br /&gt;
* &amp;lt;code&amp;gt;.dproj.local&amp;lt;/code&amp;gt; — исходный код проекта (xml)&lt;br /&gt;
* &amp;lt;code&amp;gt;.dfm&amp;lt;/code&amp;gt; — исходный код формы&lt;br /&gt;
* &amp;lt;code&amp;gt;.dpk&amp;lt;/code&amp;gt; — исходный код проекта пакета&lt;br /&gt;
* &amp;lt;code&amp;gt;.bpl&amp;lt;/code&amp;gt; — скомпилированный пакет&lt;br /&gt;
* &amp;lt;code&amp;gt;.dcu&amp;lt;/code&amp;gt; — скомпилированный модуль&lt;br /&gt;
* &amp;lt;code&amp;gt;.exe&amp;lt;/code&amp;gt; — скомпилированное приложение&lt;br /&gt;
* &amp;lt;code&amp;gt;.res&amp;lt;/code&amp;gt; — ресурсы&lt;br /&gt;
* &amp;lt;code&amp;gt;.dsk&amp;lt;/code&amp;gt; — привязки к файлам&lt;br /&gt;
* &amp;lt;code&amp;gt;.identcache&amp;lt;/code&amp;gt; — кэшированные привязки к файлам&lt;br /&gt;
&lt;br /&gt;
== Известное программное обеспечение, созданное на Delphi ==&lt;br /&gt;
Среди многих распространённых программных продуктов, написанных на Delphi:&amp;lt;ref&amp;gt;[http://delphi.wikia.com/wiki/Good_Quality_Applications_Built_With_Delphi Good Quality Applications Built With Delphi — Delphi Programming] {{Wayback|url=http://delphi.wikia.com/wiki/Good_Quality_Applications_Built_With_Delphi |date=20110630150937 }}{{ref|en}}{{неавторитетный источник|31|05|2015}}&amp;lt;/ref&amp;gt;:&lt;br /&gt;
* Продукция Embarcadero: [[Embarcadero Delphi]], Embarcadero [[C++ Builder]], Borland [[JBuilder]] 1 и 2 версии.&lt;br /&gt;
* Администрирование и разработка баз данных: [[MySQL Tools]], [[IBExpert]], Open Server.&lt;br /&gt;
* Инженерное программное обеспечение: [[Altium Designer]], [[SprutCAM]].&lt;br /&gt;
* Файловые менеджеры: [[Total Commander]], [[Frigate]], [[ViewFD]], [[FreeCommander]].&lt;br /&gt;
* Просмотрщики графики: [[FastStone Image Viewer]], [[FuturixImager]], [[drComRead]].&lt;br /&gt;
* Редакторы графики: [[IcoFX]].&lt;br /&gt;
* Видео- и аудиопроигрыватели: [[Light Alloy]], [[The KMPlayer]], [[AIMP]], [[X-Amp]], [[Nata Player]].&lt;br /&gt;
* Программы мгновенного обмена сообщениями: [[QIP 2012]], [[R&amp;amp;Q]], [[The Bat!]], [[PopTray]], [[FeedDemon]], [[MyChat]], [[Skype]] (до покупки [[Microsoft]]).&lt;br /&gt;
* Клиенты файлообменных сетей: [[Shareman]], Ares Galaxy.&lt;br /&gt;
* Создание музыки: [[FL Studio]], [[Guitar Pro]] (до версии 6.0).&lt;br /&gt;
* Разработка программного обеспечения: [[Dev-C++]], [[DUnit]], [[Game Maker]], [[Inno Setup]], [[PyScripter]], PE Explorer.&lt;br /&gt;
* Редакторы ресурсов: [[Resource Hacker]], [[Resource Tuner]].&lt;br /&gt;
* Веб-разработка: [[Macromedia HomeSite]], PHPEdit.&lt;br /&gt;
* Текстовые редакторы: [[BirEdit]], [[Notepad GNU]], [[Bred]] (до версии Bred 3), [[PSPad]].&lt;br /&gt;
* Учёт и налогообложение: [[Меркурий-ERP]], «[[Бюджет 21 (программный продукт)|Бюджет 21]]», «[[Парус (программный продукт)|Парус]]», [[AVARDA]] (до версии 6.x включительно), [[R-Keeper|r_keeper]], Traider Alpha.&lt;br /&gt;
* Система электронной очереди «[[МАКСИМА (система электронной очереди)|МАКСИМА]]»&amp;lt;ref&amp;gt;{{Cite web|url=http://mtg-biz.ru/solutions/more/3665/|title=Система электронной очереди &amp;quot;МАКСИМА&amp;quot;|publisher=mtg-biz.ru|access-date=2017-01-05|archive-date=2017-01-06|archive-url=https://web.archive.org/web/20170106010944/http://mtg-biz.ru/solutions/more/3665/|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Программы хранения и обработки медицинских изображений Makhaon Worsktation&amp;lt;ref&amp;gt;{{Cite web |url=http://www.makhaon.com/index.php?lng=ru&amp;amp;p=products |title=Makhaon Worsktation |access-date=2015-10-01 |archive-date=2015-10-02 |archive-url=https://web.archive.org/web/20151002223822/http://www.makhaon.com/index.php?lng=ru&amp;amp;p=products |url-status=live }}&amp;lt;/ref&amp;gt;, Makhaon Storage&amp;lt;ref&amp;gt;{{Cite web |url=http://www.makhaon.com/index.php?lng=ru&amp;amp;p=products |title=Makhaon Storage |access-date=2015-10-01 |archive-date=2015-10-02 |archive-url=https://web.archive.org/web/20151002223822/http://www.makhaon.com/index.php?lng=ru&amp;amp;p=products |url-status=live }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Программы для создания [[Мультипликация (технология)|анимаций]]: Pivot Stickfigure Animator.&lt;br /&gt;
* Программы для [[Сжатие данных|сжатия данных]]: [[ALZip]], [[PowerArchiver]], [[IZArc]].&lt;br /&gt;
* Нахождение и уничтожение шпионского ПО и вредоносных программ: [[Spybot — Search &amp;amp; Destroy]].&lt;br /&gt;
* Компьютерные игры: [[Age of Wonders]], «[[Космические рейнджеры]]», [[Космические рейнджеры HD: Революция]], [[Venom. Codename: Outbreak]], [[Space Empires V]], «[[Правда о девятой роте]]».&lt;br /&gt;
* Лаунчер портативных программ: [[PortableApps]].&lt;br /&gt;
* Дефрагментация диска: [[SmartDefrag]].&lt;br /&gt;
* Различные системные утилиты: [[TreeSize]].&lt;br /&gt;
* Терминал для работы с COM-портом: TerminalTMB.&lt;br /&gt;
&lt;br /&gt;
== Критика ==&lt;br /&gt;
{{Орисс в разделе|дата=2021-04-05}}&lt;br /&gt;
&lt;br /&gt;
=== Критика языка на ранних этапах развития ===&lt;br /&gt;
История критики Pascal восходит к 1981 году и работе Брайана Кернигана&amp;lt;ref&amp;gt;{{cite web | url=http://www.lysator.liu.se/c/bwk-on-pascal.html | title=Why Pascal is Not My Favorite Programming Language | access-date=2016-05-23 | archive-date=2009-04-28 | archive-url=https://web.archive.org/web/20090428163341/https://www.princeton.edu/~mike/unixhistory | url-status=live }}&amp;lt;/ref&amp;gt;, аргументы которой в основном устарели по мере развития языка.&lt;br /&gt;
&lt;br /&gt;
=== Нововведения для компиляции на мобильные платформы ===&lt;br /&gt;
Некоторые изменения языка, осуществлённые компанией Embarcadero (разработчиком языка) в так называемых NextGen-компиляторах языка Delphi, намеренно &#039;&#039;нарушили&#039;&#039; совместимость с накопленной базой исходного кода. Эти изменения были отрицательно восприняты широким кругом опытных Delphi-разработчиков, поскольку, хотя и приближали язык к парадигме языков .NET, но &#039;&#039;сломали&#039;&#039; традицию высокой обратной совместимости и существенно затруднили перенос имеющегося исходного кода в программное обеспечение для мобильных платформ.&lt;br /&gt;
Указанные ниже изменения поставили под сомнение самую парадигму мультиплатформенной разработки на базе единого исходного кода, рекламируемую Embarcadero.&lt;br /&gt;
* введение индексации строк по нулевой базе&lt;br /&gt;
Со времён Pascal исторически сложилось, что встроенный строковый тип индексировался с базой в единицу: «нулевой» элемент строки возвращал длину строки. По мере введения новых («длинных» и «юникодных») строковых типов данный порядок индексации сохранялся, обеспечивая почти бесшовный перенос кодовой базы на обновлённые версии языка. Однако со введением nextgen-компиляции парадигма изменилась: в новых компиляторах строки стали индексироваться по нулевой базе, как и в семействе С-подобных языков (C++, C#, Java), при этом в «классических» компиляторах для Windows и Mac OS парадигма единичной индексации была сохранена.&lt;br /&gt;
* введение безальтернативного механизма подсчёта ссылок для экземпляров классов&lt;br /&gt;
Исторически классы и их экземпляры являются неявно-ссылочными структурными типами. Тем не менее, управление временем жизни экземпляра класса изначально выполнялось вручную — посредством явного вызова конструктора и деструктора (либо метода &amp;lt;code&amp;gt;Free()&amp;lt;/code&amp;gt;), и такая особенность сохраняется (по состоянию на 2018 год) в &#039;&#039;классических&#039;&#039; версиях компиляторов. [[Подсчёт ссылок]] работал лишь для классов, реализующих интерфейсы, и притом, в том только случае, когда манипуляции с такими классами производились посредством переменных интерфейсного типа.&lt;br /&gt;
&lt;br /&gt;
До версии 10.4 компиляторы для мобильных платформ ввели подсчёт ссылок для всех экземпляров классов, тем самым в корне изменив парадигму управлением временем жизни объектов, поскольку «ручное» управление практически (за исключением некоторых весьма продвинутых техник) несовместимо с новой парадигмой.&lt;br /&gt;
&lt;br /&gt;
С версии 10.4 введен единый механизм управления памятью&amp;lt;ref&amp;gt;{{Cite web|lang=ru|url=https://www.embarcadero.com/ru/products/rad-studio/whats-new-in-10-4-sydney|title=Что нового в RAD Studio 10.4|website=Embarcadero Website|access-date=2020-09-15|archive-date=2020-06-03|archive-url=https://web.archive.org/web/20200603101033/https://www.embarcadero.com/ru/products/rad-studio/whats-new-in-10-4-sydney|url-status=dead}}&amp;lt;/ref&amp;gt;, когда для мобильных, настольных и серверных используется классическая реализация управления памятью объектов. ARC-модель управления памятью model осталась для управления строками и ссылками на тип интерфейса на всех платформах.&lt;br /&gt;
&lt;br /&gt;
=== Медленная эволюция языковых средств ===&lt;br /&gt;
Многие разработчики рассматривают консервативность Delphi как достоинство, которое обеспечивает высокую переносимость кода, а также упрощает понимание языка начинающими программистами.&lt;br /&gt;
&lt;br /&gt;
Однако в настоящее время ситуация такова, что &#039;&#039;новые&#039;&#039; технологии, парадигмы и даже языки программирования появляются (и набирают популярность) едва ли не каждый год. Развитие же языковых средств &#039;&#039;не всегда&#039;&#039; влечёт за собой отказ от обратной совместимости.&lt;br /&gt;
&lt;br /&gt;
Ярким примером такого подхода является&lt;br /&gt;
{{Начало скрытого блока|Заголовок =&#039;&#039;запоздалое&#039;&#039; введение в язык объявления локальных переменных внутри блока|Выравнивание_заголовка=left|Фон_заголовка=Azure}}&lt;br /&gt;
[[Файл:QC Inline.png|thumb|upright=1.2|right|Обсуждение на Embarcadero Quality Portal]]&lt;br /&gt;
До версии компилятора 33.0 (Delphi 10.3 Rio) объявление локальной переменной должно было &#039;&#039;предшествовать&#039;&#039; первой инструкции кода функции, причём инициализация локальных (стековых) переменных в месте объявления не допускается. Невозможен был также и вывод типа.&lt;br /&gt;
&lt;br /&gt;
Для сравнения, объявление локальной переменной в любом месте функции поддерживалось в языке Си изначально, и было унаследовано практически всеми языками, которые придерживались Си-подобного стиля — C++, C#, Java и др.&lt;br /&gt;
&lt;br /&gt;
Введение этого языкового средства в Delphi обсуждалось давно, но в то время не встретило понимания разработчиков языка.&lt;br /&gt;
{{Конец скрытого блока}}&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Нил Дж. Рубенкинг.&lt;br /&gt;
|заглавие = Язык программирования Delphi для «чайников». Введение в Borland Delphi 2006&lt;br /&gt;
|ссылка = https://archive.org/details/delphi3fordummie0000rube&lt;br /&gt;
|оригинал = Delphi for Dummies&lt;br /&gt;
|место = М. |издательство = [[Диалектика (издательство)|Диалектика]]&lt;br /&gt;
|год = 2007&lt;br /&gt;
|страниц = 336&lt;br /&gt;
|isbn = 0-7645-0179-8&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Хавьер Пашеку.&lt;br /&gt;
|заглавие = Программирование в Borland Delphi 2006 для профессионалов&lt;br /&gt;
|оригинал = Delphi for .NET Developer’s Guide&lt;br /&gt;
|место = М. |издательство = [[Вильямс (издательство)|Вильямс]]&lt;br /&gt;
|год = 2006&lt;br /&gt;
|страниц = 944&lt;br /&gt;
|isbn = 0-672-32443-X&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько.&lt;br /&gt;
|заглавие = Программирование на языке Delphi. Учебное пособие&lt;br /&gt;
|ссылка = http://www.rsdn.ru/?article/Delphi/Delphi_7_00.xml&lt;br /&gt;
|год = 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{Навигация|Тема=Delphi|Викиучебник=Delphi}}&lt;br /&gt;
* [https://www.embarcadero.com/ru/products/delphi Домашняя страница среды программирования Delphi] на сайте [[Embarcadero Technologies]]&lt;br /&gt;
&lt;br /&gt;
{{Pascal}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Delphi]]&lt;/div&gt;</summary>
		<author><name>31.41.59.210</name></author>
	</entry>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=C_Sharp&amp;diff=1462</id>
		<title>C Sharp</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=C_Sharp&amp;diff=1462"/>
		<updated>2026-03-22T08:29:39Z</updated>

		<summary type="html">&lt;p&gt;31.41.59.210: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{не путать|C++}}&lt;br /&gt;
{{другие значения термина|C}}&lt;br /&gt;
{{неверный заголовок|C#}}&lt;br /&gt;
{{Карточка языка программирования&lt;br /&gt;
| name = С#&lt;br /&gt;
| логотип = C Sharp Logo 2023.svg&lt;br /&gt;
| file ext = &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
| semantics = &lt;br /&gt;
| paradigm = [[Мультипарадигменный язык программирования|мультипарадигмальный]]:&amp;lt;br&amp;gt;&lt;br /&gt;
[[объектно-ориентированное программирование|объектно-ориентированный]], &amp;lt;br&amp;gt;&lt;br /&gt;
[[обобщённое программирование|обобщённый]], &lt;br /&gt;
[[процедурное программирование|процедурный]],&lt;br /&gt;
[[функциональное программирование|функциональный]],&lt;br /&gt;
[[Событийно-ориентированное программирование|событийный]],  &lt;br /&gt;
[[Отражение (программирование)|рефлективный]]&lt;br /&gt;
| class = &lt;br /&gt;
| designer = [[Хейлсберг, Андерс|Андерс Хейлсберг]]&lt;br /&gt;
| разработчик = [[.NET Foundation]]&lt;br /&gt;
| latest_release_version = 14&lt;br /&gt;
| latest_release_date = [[11 ноября]] [[2025 год]]а&lt;br /&gt;
| latest_preview_version = &lt;br /&gt;
| latest_preview_date = &lt;br /&gt;
| typing = [[Статическая типизация|статическая]], [[Динамическая типизация|динамическая]], [[Строгая типизация|строгая]], [[Система типов#Типобезопасность и защита адресации памяти|безопасная]], [[вывод типов]]&lt;br /&gt;
| implementations = {{s|[[.NET Framework]]}}, [[Mono]], {{s|[[.NET]]}}, [[DotGNU|DotGNU (заморожен)]], [[Universal Windows Platform]]&lt;br /&gt;
| dialects = [[Cω]], [[Spec Sharp|Spec#]], {{iw|Polyphonic C Sharp|Polyphonic C#|en|Polyphonic C Sharp}}, [http://ecsharp.net Enhanced C#]&lt;br /&gt;
| influenced_by = [[C++]], [[Java]]&amp;lt;ref name=&amp;quot;nash&amp;quot;&amp;gt;&#039;&#039;«Поскольку язык С# унаследовал свой синтаксис от C++ и Java…»&#039;&#039; {{книга&lt;br /&gt;
 | автор         = Трей Нэш&lt;br /&gt;
 | заглавие      = C# 2010: ускоренный курс для профессионалов&lt;br /&gt;
 | ссылка       = https://archive.org/details/isbn_9785845916389&lt;br /&gt;
 | оригинал      = Accelerated C# 2010&lt;br /&gt;
 | место         = М.&lt;br /&gt;
 | издательство  = Вильямс&lt;br /&gt;
 | год           = 2010&lt;br /&gt;
 | страницы      = [https://archive.org/details/isbn_9785845916389/page/n16 17]&lt;br /&gt;
 | страниц       = 592&lt;br /&gt;
 | isbn          = 978-5-8459-1638-9&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Shildt2003&amp;quot;&amp;gt;&#039;&#039;«Язык C# &amp;lt;…&amp;gt; унаследовал много полезных возможностей от других языков программирования и напрямую связан с двумя наиболее широко применяемыми в мире компьютерными языками — C и C++, а также с языком Java»&#039;&#039;, однако далее: &#039;&#039;«Связь между C# и Java более сложная. Оба языка разработаны для создания переносимого кода, базируются на C и C++, используют их синтаксис и объектную модель. Однако между этими языками нет прямой связи, они больше похожи на двоюродных братьев, имеющих общих предков, но отличающихся многими признаками»&#039;&#039; {{книга&lt;br /&gt;
 | автор         = [[Шилдт, Герберт|Герберт Шилдт]]&lt;br /&gt;
 | заглавие      = C# учебный курс&lt;br /&gt;
 | оригинал      = C#. A Beginner&#039;s Guide&lt;br /&gt;
 | место         = М.&lt;br /&gt;
 | издательство  = [[Питер (издательство)|Питер]]&lt;br /&gt;
 | год           = 2003&lt;br /&gt;
 | страницы      = 20&lt;br /&gt;
 | isbn          = 966-552-121-7&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;Shildt2004&amp;quot;&amp;gt;{{книга&lt;br /&gt;
 | автор         = [[Шилдт, Герберт|Герберт Шилдт]]&lt;br /&gt;
 | заглавие      = Полный справочник по С#&lt;br /&gt;
 | ссылка       = https://archive.org/details/isbn_584590563X| оригинал      = C#: The Complete Reference&lt;br /&gt;
 | место         = М.&lt;br /&gt;
 | издательство  = Издательский дом «Вильямс»&lt;br /&gt;
 | год           = 2004&lt;br /&gt;
 | страницы      = [https://archive.org/details/isbn_584590563X/page/n24 26]—27&lt;br /&gt;
 | страниц       = 752&lt;br /&gt;
 | isbn          = 5-8459-0563-X&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, [[Delphi (язык программирования)|Delphi]], [[Модула-3]] и [[Smalltalk]]&lt;br /&gt;
| influenced = [[Cω]], [[F Sharp|F#]], [[Nemerle]], [[Vala]], [[Windows PowerShell]], [[Kotlin]]&lt;br /&gt;
| лицензия = Компилятор [[Roslyn (компилятор)|Roslyn]]: [[лицензия MIT]]&amp;lt;ref name=&amp;quot;Лицензия (Roslyn) в официальном репозитории&amp;quot;&amp;gt;{{Cite web |url=https://github.com/dotnet/roslyn/blob/main/License.txt |title=Лицензия (Roslyn) в репозитории Github |access-date=2022-01-04 |archive-date=2022-01-04 |archive-url=https://web.archive.org/web/20220104054409/https://github.com/dotnet/roslyn/blob/main/License.txt |url-status=live }}&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[.NET|.NET Core CLR]]: [[лицензия MIT]]&amp;lt;ref name=&amp;quot;Лицензия (.NET CLR) в официальном репозитории&amp;quot;&amp;gt;{{Cite web |url=https://github.com/dotnet/runtime/blob/main/LICENSE.TXT |title=Лицензия (.NET CLR) в репозитории Github |access-date=2022-01-04 |archive-date=2022-01-04 |archive-url=https://web.archive.org/web/20220104054407/https://github.com/dotnet/runtime/blob/main/LICENSE.TXT |url-status=live }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компилятор [[Mono (software)|Mono]]: dual [[GPLv3]] and MIT/X11&amp;lt;br&amp;gt;&lt;br /&gt;
[[DotGNU]]: dual [[GPL]] and [[LGPL]]&lt;br /&gt;
| сайт = https://docs.microsoft.com/ru-ru/dotnet/csharp/&lt;br /&gt;
| платформа = [[Common Language Infrastructure]]&lt;br /&gt;
| Семейство = {{iw|Список языков програмирования семейства C|C|en|List of C-family programming languages}}&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;C#&#039;&#039;&#039; (произносится &#039;&#039;си шарп&#039;&#039;) — [[объектно-ориентированное программирование|объектно-ориентированный]] [[язык программирования]] общего назначения. Разработан в [[1998]]—[[2001 год]]ах группой инженеров компании [[Microsoft]] под руководством [[Хейлсберг, Андерс|Андерса Хейлсберга]] и [[Скотт Вильтаумот|Скотта Вильтаумота]]&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 | автор         = Либерти Д.&lt;br /&gt;
 | часть         = Язык программирования C#&lt;br /&gt;
 | ссылка часть  = &lt;br /&gt;
 | заглавие      = Программирование на C#&lt;br /&gt;
 | год         = 2003&lt;br /&gt;
 | оригинал      = &lt;br /&gt;
 | ссылка        = https://archive.org/details/isbn_5932860383&lt;br /&gt;
 | url-access         = registration&lt;br /&gt;
 | викитека      = &lt;br /&gt;
 | ответственный = &lt;br /&gt;
 | издание       = Санкт-Петербург&lt;br /&gt;
 | место         = 2003&lt;br /&gt;
 | издательство  = Символ-Плюс&lt;br /&gt;
 | том           = &lt;br /&gt;
 | страницы      = [https://archive.org/details/isbn_5932860383/page/n25 26]&lt;br /&gt;
 | столбцы       = &lt;br /&gt;
 | страниц       = 688&lt;br /&gt;
 | серия         = &lt;br /&gt;
 | isbn          = 5-93286-038-3&lt;br /&gt;
 | doi           = &lt;br /&gt;
 | тираж         = &lt;br /&gt;
 | ref           = &lt;br /&gt;
}}&amp;lt;/ref&amp;gt; как язык разработки приложений для платформы [[.NET Framework|Microsoft .NET Framework]] и [[.NET]]. Впоследствии был стандартизирован как [[ECMA]]-334 и [[ISO]]/[[IEC]] 23270.&lt;br /&gt;
&lt;br /&gt;
C# относится к семье языков с [[C-подобный синтаксис|C-подобным синтаксисом]], из них его синтаксис наиболее близок к [[C++]] и [[Java]]. Язык имеет [[статическая типизация|статическую типизацию]], поддерживает [[Полиморфизм (информатика)|полиморфизм]], [[Перегрузка операторов|перегрузку операторов]] (в том числе операторов явного и неявного приведения типа), [[Делегат (программирование)|делегаты]], атрибуты, [[Событийно-ориентированное программирование|события]], [[Переменная (программирование)|переменные]], [[Свойство (программирование)|свойства]], [[Обобщённое программирование|обобщённые]] типы и методы, [[итератор]]ы, [[Анонимная функция|анонимные функции]] с поддержкой [[Замыкание (программирование)|замыканий]], [[Language Integrated Query|LINQ]], [[обработка исключений|исключения]], [[Комментарии (программирование)|комментарии]] в формате [[XML]].&lt;br /&gt;
&lt;br /&gt;
Переняв многое от своих предшественников — языков [[C++]], [[Delphi (язык программирования)|Delphi]], [[Модула-2|Модула]], [[Smalltalk]] и, в особенности, [[Java]] — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает [[множественное наследование]] классов (между тем допускается [[Интерфейс (объектно-ориентированное программирование)#Множественное наследование и реализация интерфейсов|множественная реализация интерфейсов]]).&lt;br /&gt;
&lt;br /&gt;
== Особенности языка ==&lt;br /&gt;
С# разрабатывался как язык программирования прикладного уровня для [[Common Language Runtime|CLR]] и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов С#, которая отражает [[Base Class Library|BCL]]. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем (однако, эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы .NET). CLR предоставляет С#, как и всем другим [[.NET Framework|.NET]]-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, [[сборка мусора]] не реализована в самом C#, а производится CLR для программ, написанных на C#, точно так же, как это делается для программ на [[Visual Basic .NET|VB.NET]], [[Visual J#|J#]] и др.&lt;br /&gt;
&lt;br /&gt;
== Название языка ==&lt;br /&gt;
[[Файл:Treblecsharp5.svg|thumb|90px|[[Нота (музыка)|Нота]] {{iw|До-диез|C♯|en|C♯ (musical note)}}]]&lt;br /&gt;
Название «Си шарп» (от англ. sharp — диез) происходит от [[Буквенная нотация|буквенной музыкальной нотации]], где латинской букве &#039;&#039;C&#039;&#039; соответствует нота [[До]], а знак [[диез]] (англ. sharp) означает повышение соответствующего ноте [[звук]]а на [[полутон]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 | url        = http://www.jameskovacs.com/blog/CNETHistoryLesson.aspx&lt;br /&gt;
| title        = C#/.NET History Lesson&lt;br /&gt;
| first        = James&lt;br /&gt;
| last        = Kovacs&lt;br /&gt;
| date        = 2007-09-07&lt;br /&gt;
| access-date        = 2011-03-23&lt;br /&gt;
| lang        = en&lt;br /&gt;
| archive-url        = https://www.webcitation.org/616vU96EP?url=http://jameskovacs.com/2007/09/07/cnet-history-lesson/&lt;br /&gt;
| archive-date        = 2011-08-21&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, что аналогично названию языка [[C++]], где «++» обозначает [[инкремент]] [[Переменная (программирование)|переменной]]. Название также является игрой с цепочкой [[Си (язык программирования)|C]] → [[C++]] → C++++(C#), так как символ «#» можно представить состоящим из 4 знаков «+»&amp;lt;ref&amp;gt;{{cite web|url=http://www.computerworld.com.au/article/261958/a-z_programming_languages_c_/?pp=2|title=The A-Z of Programming Languages: C#|date=2008-10-01|publisher=[http://www.computerworld.com.au computerworld.com.au]|lang=en|access-date=2014-09-02|archive-date=2015-04-02|archive-url=https://web.archive.org/web/20150402120752/https://www.computerworld.com.au/article/261958/a-z_programming_languages_c_/?pp=2|url-status=dead}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из-за технических ограничений на отображение (стандартные шрифты, браузеры и т. д.), а также из-за того, что знак диеза ♯ не представлен на стандартной [[Компьютерная клавиатура|клавиатуре компьютера]], при записи имени языка программирования используют [[знак решётки]] (#)&amp;lt;ref name=&amp;quot;MS CSharp FAQ&amp;quot;&amp;gt;{{cite web|url=https://msdn.microsoft.com/ru-ru/library/67ef8sbd.aspx |title=Microsoft C# FAQ |publisher=[[Microsoft]] |access-date=2008-03-25 |url-status=dead |archive-url=https://web.archive.org/web/20030430202730/http://msdn.microsoft.com/vcsharp/previous/2002/FAQ/default.aspx |archive-date=2003-04-30 }}&amp;lt;/ref&amp;gt;. Это соглашение отражено в Спецификации языка C# ECMA-334&amp;lt;ref name=&amp;quot;ECMA-334&amp;quot;&amp;gt;{{книга&lt;br /&gt;
|ссылка=http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf&lt;br /&gt;
|заглавие=C# Language Specification&lt;br /&gt;
|издательство=[[Ecma International]]&lt;br /&gt;
|издание=4th&lt;br /&gt;
|год=2006&lt;br /&gt;
|язык=&lt;br /&gt;
|месяц=6&lt;br /&gt;
|archive-date=2012-12-02&lt;br /&gt;
|archive-url=https://web.archive.org/web/20121202194727/http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf&lt;br /&gt;
}} {{Cite web |url=http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf |title=Архивированная копия |access-date=2011-01-26 |archive-date=2012-12-02 |archive-url=https://web.archive.org/web/20121202194727/http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf |url-status=unfit }}&amp;lt;/ref&amp;gt;. Тем не менее, на практике (например, при размещении рекламы и коробочном дизайне&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 | url  = http://www.microsoft.com/presspass/images/gallery/boxshots/web/visual-c-sharp03.jpg&lt;br /&gt;
| title  = Visual C#.net Standard&lt;br /&gt;
| date  = 2003-09-04&lt;br /&gt;
| publisher  = [[Microsoft]]&lt;br /&gt;
| format  = JPEG&lt;br /&gt;
| access-date  = 2009-06-18&lt;br /&gt;
| archive-url  = https://www.webcitation.org/616vVNZ7G?url=http://www.microsoft.com/presspass/images/gallery/boxshots/web/visual-c-sharp03.jpg&lt;br /&gt;
| archive-date  = 2011-08-21&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;), «Майкрософт» использует знак диеза.&lt;br /&gt;
&lt;br /&gt;
Названия языков программирования не принято переводить, поэтому язык называют, используя транскрипцию, — «Си шарп».&lt;br /&gt;
&lt;br /&gt;
== Стандартизация ==&lt;br /&gt;
C# стандартизирован в [[Ecma International|ECMA]] (ECMA-334)&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url          = http://www.ecma-international.org/publications/standards/Ecma-334.htm&lt;br /&gt;
 |title        = Standard ECMA-334 C# Language Specification, 4rd edition&lt;br /&gt;
 |date         = 2006-06&lt;br /&gt;
 |publisher    = [[Ecma International]]&lt;br /&gt;
 |access-date   = 2017-05-16&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |archive-date = 2010-10-31&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20101031042906/http://www.ecma-international.org/publications/standards/Ecma-334.htm&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; и [[ISO]] (ISO/IEC 23270)&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url          = https://www.iso.org/standard/36768.html&lt;br /&gt;
 |title        = ISO/IEC 23270:2003 Information technology -- C# Language Specification&lt;br /&gt;
 |date         = 2003-04&lt;br /&gt;
 |publisher    = [[Международная организация по стандартизации|International Organization for Standardization]]&lt;br /&gt;
 |access-date   = 2017-05-16&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |archive-date = 2017-08-05&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20170805060800/https://www.iso.org/standard/36768.html&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Известно как минимум о трёх независимых реализациях C#, базирующихся на этой спецификации и находящихся в настоящее время на различных стадиях разработки:&lt;br /&gt;
* [[Mono]], начата компанией [[Ximian]], продолжена её покупателем и преемником [[Novell]], а затем [[Xamarin]].&lt;br /&gt;
* [[dotGNU]] и [[Portable.NET]], разрабатываемые [[Free Software Foundation]].&lt;br /&gt;
&lt;br /&gt;
== Версии ==&lt;br /&gt;
На протяжении разработки языка C# было выпущено несколько его версий:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Версия&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Спецификация языка&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Дата выхода&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Совместимые версии [[.NET]]&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Совместимая версия [[Visual Studio]]&lt;br /&gt;
|-&lt;br /&gt;
! [[Ecma International|ECMA]]&lt;br /&gt;
! [[ISO/IEC JTC1|ISO/IEC]]&lt;br /&gt;
! Microsoft&lt;br /&gt;
|-&lt;br /&gt;
| C# 1.0&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|[https://web.archive.org/web/20100307105608/http://www.ecma-international.org/publications/files/ECMA-ST-WITHDRAWN/ECMA-334,%202nd%20edition,%20December%202002.pdf Декабрь 2002]&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;|[http://download.www.techstreet.com/cgi-bin/pdf/free/378672/ISO+IEC+23270-2003.pdf Апрель 2003]{{Недоступная ссылка|date=2018-01|bot=InternetArchiveBot }}&lt;br /&gt;
| [http://download.microsoft.com/download/a/9/e/a9e229b9-fee5-4c3e-8476-917dee385062/CSharp%20Language%20Specification%20v1.0.doc Январь 2002]&lt;br /&gt;
| Январь 2002&lt;br /&gt;
|[[.NET Framework#.NET Framework 1.0|.NET Framework 1.0]]&lt;br /&gt;
|[[Microsoft Visual Studio|Visual Studio .NET (2002)]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 1.1&amp;lt;br&amp;gt;C# 1.2&lt;br /&gt;
| [http://download.microsoft.com/download/5/e/5/5e58be0a-b02b-41ac-a4a3-7a22286214ff/csharp%20language%20specification%20v1.2.doc Октябрь 2003]&lt;br /&gt;
| Апрель 2003&lt;br /&gt;
|[[.NET Framework#.NET Framework 1.1|.NET Framework 1.1]]&lt;br /&gt;
|[[Microsoft Visual Studio|Visual Studio .NET 2003]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 2.0&lt;br /&gt;
| [https://web.archive.org/web/20121202194727/http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf Июнь 2006]&lt;br /&gt;
| [http://standards.iso.org/ittf/PubliclyAvailableStandards/c042926_ISO_IEC_23270_2006(E).zip Сентябрь 2006]&lt;br /&gt;
| [http://download.microsoft.com/download/9/8/f/98fdf0c7-2bbd-40d3-9fd1-5a4159fa8044/csharp%202.0%20specification_sept_2005.doc Сентябрь 2005]&amp;lt;ref name=&amp;quot;note&amp;quot;&amp;gt;Спецификация по Microsoft C# 2.0 содержит описание лишь новых возможностей версии 2.0. Особенности версии описаны в спецификации 1.2, приведенной выше.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| Ноябрь 2005&lt;br /&gt;
|[[.NET Framework#.NET Framework 2.0|.NET Framework 2.0]]&amp;lt;br&amp;gt;[[.NET Framework#.NET Framework 3.0|.NET Framework 3.0]]&lt;br /&gt;
|[[Microsoft Visual Studio|Visual Studio 2005]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 3.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; {{no|Отсутствует}}&amp;lt;ref name=autogenerated1&amp;gt;Для версий языка C# 3.0, 4.0 и 5.0 пока нет утверждённых ECMA или ISO/IEC спецификаций.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| [http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/CSharp%20Language%20Specification.doc Август 2007]&lt;br /&gt;
| Ноябрь 2007&lt;br /&gt;
|[[.NET Framework#.NET Framework 2.0|.NET Framework 2.0]] (кроме [[LINQ]])&amp;lt;br&amp;gt;[[.NET Framework#.NET Framework 3.0|.NET Framework 3.0]] (кроме [[LINQ]])&amp;lt;br&amp;gt;[[.NET Framework#.NET Framework 3.5|.NET Framework 3.5]]&lt;br /&gt;
|[[Microsoft Visual Studio|Visual Studio 2008]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 4.0&lt;br /&gt;
| [http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=dfbf523c-f98c-4804-afbd-459e846b268e Апрель 2010]&lt;br /&gt;
| Апрель 2010&lt;br /&gt;
|[[.NET Framework#.NET Framework 4.0|.NET Framework 4.0]]&lt;br /&gt;
|[[Microsoft Visual Studio|Visual Studio 2010]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 5.0&lt;br /&gt;
| [https://web.archive.org/web/20121202194727/http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf Декабрь 2017]&lt;br /&gt;
| [https://standards.iso.org/ittf/PubliclyAvailableStandards/c075178_ISO_IEC_23270_2018.zip Декабрь 2018]&lt;br /&gt;
| [http://www.microsoft.com/en-us/download/details.aspx?id=7029 Июнь 2013]&lt;br /&gt;
| Август 2012&lt;br /&gt;
|[[.NET Framework#.NET Framework 4.5|.NET Framework 4.5]]&lt;br /&gt;
|[[Microsoft Visual Studio|Visual Studio 2012]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 6.0&lt;br /&gt;
| [https://ecma-international.org/wp-content/uploads/ECMA-334_6th_edition_june_2022.pdf Июнь 2022]&lt;br /&gt;
| {{no|Отсутствует}}&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Июль 2015&lt;br /&gt;
| [[.NET Framework#.NET Framework 4.6|.NET Framework 4.6]]&amp;lt;br&amp;gt;[[.NET|.NET Core 1.0]]&amp;lt;br&amp;gt;[[.NET|.NET Core 1.1]]&lt;br /&gt;
| [[Microsoft Visual Studio|Visual Studio 2015]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 7.0&lt;br /&gt;
| [https://ecma-international.org/wp-content/uploads/ECMA-334_7th_edition_december_2023.pdf Декабрь 2023]&lt;br /&gt;
| [https://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_IEC%2020619_2023%20ed.1%20-%20id.86347%20Publication%20PDF%20(en).zip Сентябрь 2023]&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Март 2017&lt;br /&gt;
| [[.NET Framework#.NET Framework 4.6.2|.NET Framework 4.6.2]]&amp;lt;br&amp;gt;[[.NET Framework#.NET Framework 4.7|.NET Framework 4.7]]&lt;br /&gt;
| [[Microsoft Visual Studio|Visual Studio 2017 15.0]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 7.1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;8&amp;quot; {{no|Отсутствует}}&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Август 2017&lt;br /&gt;
| [[.NET|.NET Core 2.0]]&lt;br /&gt;
| [[Microsoft Visual Studio|Visual Studio 2017 15.3]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 7.2&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Ноябрь 2017&lt;br /&gt;
|&lt;br /&gt;
| [[Microsoft Visual Studio|Visual Studio 2017 15.5]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 7.3&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Май 2018&lt;br /&gt;
| [[.NET|.NET Core 2.1]]&amp;lt;br&amp;gt;[[.NET|.NET Core 2.2]]&amp;lt;br&amp;gt;[[.NET Framework#.NET Framework 4.8|.NET Framework 4.8]]&lt;br /&gt;
| [[Microsoft Visual Studio|Visual Studio 2017 15.7]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 8.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Сентябрь 2019&lt;br /&gt;
|[[.NET|.NET Core 3.0]]&amp;lt;br&amp;gt;[[.NET|.NET Core 3.1]]&amp;lt;br&amp;gt;[[.NET Framework#.NET Framework 4.8|.NET Framework 4.8]]&lt;br /&gt;
|[[Microsoft Visual Studio|Visual Studio 2019 16.3]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 9.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Сентябрь 2020&lt;br /&gt;
|[[.NET|.NET 5.0]]&lt;br /&gt;
|[[Microsoft Visual Studio|Visual Studio 2019 16.8]]&lt;br /&gt;
|-&lt;br /&gt;
| C# 10.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Июль 2021&lt;br /&gt;
|[[.NET|.NET 6.0]]&lt;br /&gt;
|[[Microsoft Visual Studio|Visual Studio 2022 17.0]]&lt;br /&gt;
|-&lt;br /&gt;
|C# 11.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Ноябрь 2022&lt;br /&gt;
| [[.NET|.NET 7.0]]&lt;br /&gt;
| [[Microsoft Visual Studio|Visual Studio 2022 17.4]]&lt;br /&gt;
|-&lt;br /&gt;
|C# 12.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | Ноябрь 2023&lt;br /&gt;
| [[.NET|.NET 8.0]]&lt;br /&gt;
| [[Microsoft Visual Studio|Visual Studio 2022 17.8]]&amp;lt;ref&amp;gt;{{Cite web|url=https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-notes-v17.8|title=Заметки релиза Visual Studio 2022 17.8 |website=Microsoft Learn|access-date=2023-06-29|archive-date=2023-08-06|archive-url=https://web.archive.org/web/20230806130647/https://learn.microsoft.com/ru-ru/visualstudio/releases/2022/release-notes-v17.8|url-status=live}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Общая информация по версиям&lt;br /&gt;
|-&lt;br /&gt;
! Версия !! Нововведения&lt;br /&gt;
 |-&lt;br /&gt;
 ! C# 2.0&lt;br /&gt;
 |&lt;br /&gt;
* Частичные типы&lt;br /&gt;
* Обобщённые типы (&#039;&#039;generics&#039;&#039;)&lt;br /&gt;
* Итераторы и ключевое слово &amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt;&lt;br /&gt;
* Анонимные методы&lt;br /&gt;
* Оператор &#039;&#039;null&#039;&#039;-объединения&lt;br /&gt;
* &#039;&#039;Nullable&#039;&#039;-типы&lt;br /&gt;
 |-&lt;br /&gt;
 !C# 3.0&lt;br /&gt;
 |&lt;br /&gt;
* Запросы, интегрированные в язык (&#039;&#039;LINQ&#039;&#039;)&lt;br /&gt;
* Инициализаторы объектов и коллекций&lt;br /&gt;
* Лямбда-выражения&lt;br /&gt;
* Деревья выражений&lt;br /&gt;
* Неявная типизация и ключевое слово &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt;&lt;br /&gt;
* Анонимные типы&lt;br /&gt;
* Методы расширения&lt;br /&gt;
* Автоматические свойства&lt;br /&gt;
 |-&lt;br /&gt;
 ! C# 4.0&lt;br /&gt;
 |&lt;br /&gt;
* Динамическое связывание и ключевое слово &amp;lt;code&amp;gt;dynamic&amp;lt;/code&amp;gt;&lt;br /&gt;
* Именованные и опциональные аргументы&lt;br /&gt;
* Обобщенная [[Ковариантность и контравариантность (программирование)|ковариантность и контрвариантность]]&lt;br /&gt;
* Библиотека &#039;&#039;TPL&#039;&#039;, концепция задач и классы &amp;lt;code&amp;gt;Task&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Parallel&amp;lt;/code&amp;gt;&lt;br /&gt;
* Класс &amp;lt;code&amp;gt;MemoryCache&amp;lt;/code&amp;gt;&lt;br /&gt;
* Классы параллельных коллекций&lt;br /&gt;
 |-&lt;br /&gt;
 ! C# 5.0&lt;br /&gt;
 |&lt;br /&gt;
* Шаблон &#039;&#039;TAP&#039;&#039;&lt;br /&gt;
* Асинхронные методы &amp;lt;code&amp;gt;async&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;await&amp;lt;/code&amp;gt;&lt;br /&gt;
* Сведения о вызывающем объекте&lt;br /&gt;
 |-&lt;br /&gt;
 ! C# 6.0&lt;br /&gt;
 |&lt;br /&gt;
* Компилятор как сервис&lt;br /&gt;
* Импорт членов статических типов в пространство имён&lt;br /&gt;
* Фильтры исключений&lt;br /&gt;
* &amp;lt;code&amp;gt;await&amp;lt;/code&amp;gt; в блоках &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;finally&amp;lt;/code&amp;gt;&lt;br /&gt;
* Инициализаторы автосвойств&lt;br /&gt;
* Автосвойства только для чтения&lt;br /&gt;
* &#039;&#039;null&#039;&#039;-условные операции (&amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;?[]&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Интерполяция строк&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;nameof&amp;lt;/code&amp;gt;&lt;br /&gt;
* Инициализатор словаря&lt;br /&gt;
* Функции сжатые до выражений&lt;br /&gt;
 |-&lt;br /&gt;
 ! C# 7.0&amp;lt;ref name=&amp;quot;seven&amp;quot;&amp;gt;{{Cite web |title=New Features in C# 7.0 |date=2017-03-09 |author=Mads Torgersen |url=https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/ |website=.NET Blog |publisher=[[Microsoft]] |access-date=2017-05-07 |lang=en |archive-date=2017-04-11 |archive-url=https://web.archive.org/web/20170411055800/https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/ |url-status=live }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 ||&lt;br /&gt;
* &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt;-переменные&lt;br /&gt;
* Сопоставление с шаблоном&lt;br /&gt;
* Шаблоны с &amp;lt;code&amp;gt;is&amp;lt;/code&amp;gt;&lt;br /&gt;
* Шаблоны и выражение &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;&lt;br /&gt;
* Кортежи&lt;br /&gt;
* Распаковка кортежей (деконструкторы)&lt;br /&gt;
* Локальные функции&lt;br /&gt;
* Улучшения литералов&lt;br /&gt;
* Локальные переменные и возвращаемые значения по ссылке&lt;br /&gt;
* Расширение списка типов, возвращаемых асинхронными методами&lt;br /&gt;
* Больше членов класса в виде выражений&lt;br /&gt;
* &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; выражения&lt;br /&gt;
|-&lt;br /&gt;
!C# 8.0&lt;br /&gt;
|&lt;br /&gt;
* Члены только для чтения&lt;br /&gt;
* Члены интерфейса по умолчанию&lt;br /&gt;
* Улучшения сопоставления шаблонов&lt;br /&gt;
* Объявления using&lt;br /&gt;
* Статические локальные функции&lt;br /&gt;
* Удаляемые ссылочные структуры&lt;br /&gt;
* Ссылочные типы, допускающие значение NULL&lt;br /&gt;
* Асинхронные потоки&lt;br /&gt;
* Индексы и диапазоны&lt;br /&gt;
* Присваивание объединения со значением NULL&lt;br /&gt;
* Неуправляемые сконструированные типы&lt;br /&gt;
* Выражения stackalloc во вложенных выражениях&lt;br /&gt;
* Больше членов класса в виде выражений&lt;br /&gt;
* Улучшения интерполированных строк&lt;br /&gt;
|-&lt;br /&gt;
!C# 9.0&lt;br /&gt;
|&lt;br /&gt;
* Оператор объединения с null (??)&lt;br /&gt;
* Пустые параметры для лямбда-выражений&lt;br /&gt;
* Native Int: nint, nuint&lt;br /&gt;
* Дизъюнктное объединение&lt;br /&gt;
* Добавлено &amp;lt;code&amp;gt;with&amp;lt;/code&amp;gt;-выражения&lt;br /&gt;
* новый модификатор &amp;lt;code&amp;gt;initonly&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!C# 10.0&lt;br /&gt;
|&lt;br /&gt;
* Добавление &amp;lt;code&amp;gt;role=&amp;quot;alert&amp;quot;&amp;lt;/code&amp;gt; атрибуты сообщений&lt;br /&gt;
* Обновления&amp;lt;code&amp;gt;Counter&amp;lt;/code&amp;gt; компонент для добавления &amp;lt;code&amp;gt;role=&amp;quot;status&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Замена ul в &amp;lt;code&amp;gt;NavBar&amp;lt;/code&amp;gt; компонент для &amp;lt;code&amp;gt;nav&amp;lt;/code&amp;gt;&lt;br /&gt;
* Новое название кнопки переключения&amp;lt;code&amp;gt;NavBar&amp;lt;/code&amp;gt;&lt;br /&gt;
* Переход к использованию более семантической разметки&lt;br /&gt;
|-&lt;br /&gt;
!C# 11.0&lt;br /&gt;
|&lt;br /&gt;
* Необработанные строковые литералы&lt;br /&gt;
* Поддержка универсальной математики&lt;br /&gt;
* Универсальные атрибуты&lt;br /&gt;
* Строковые литералы UTF-8&lt;br /&gt;
* Новые строки в выражениях интерполяции строк&lt;br /&gt;
* Шаблоны списка&lt;br /&gt;
* Локальные типы файлов&lt;br /&gt;
* Обязательные элементы&lt;br /&gt;
* Автоматические структуры по умолчанию&lt;br /&gt;
* Сопоставление &amp;lt;code&amp;gt;Span&amp;lt;char&amp;gt;&amp;lt;/code&amp;gt; шаблонов для константы string&lt;br /&gt;
* Расширенные &amp;lt;code&amp;gt;nameof&amp;lt;/code&amp;gt; область&lt;br /&gt;
* Числовой &amp;lt;code&amp;gt;intPtr&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ref&amp;lt;/code&amp;gt; поля и &amp;lt;code&amp;gt;scoped ref&amp;lt;/code&amp;gt;&lt;br /&gt;
* Улучшенное преобразование групп методов для делегирования.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 1.0 ===&lt;br /&gt;
Проект C# был начат в декабре 1998 и получил кодовое название COOL (C-style Object Oriented Language). Версия 1.0 была анонсирована вместе с платформой .NET в июне [[2000 год]]а, тогда же появилась и первая общедоступная [[Бета-тестирование|бета-версия]]; C# 1.0 окончательно вышел вместе с [[Microsoft Visual Studio]] .NET в феврале [[2002 год]]а.&lt;br /&gt;
&lt;br /&gt;
Первая версия C# напоминала по своим возможностям Java 1.4, несколько их расширяя: так, в C# имелись &#039;&#039;свойства&#039;&#039; (выглядящие в [[Исходный код|коде]] как [[Поле класса|поля]] [[Объект (программирование)|объекта]], но на деле вызывающие при обращении к ним методы класса), индексаторы (подобные свойствам, но принимающие параметр как индекс массива), [[Событийно-ориентированное программирование|события]], [[Делегат (программирование)|делегаты]], [[Цикл (программирование)|циклы]] &amp;lt;code&amp;gt;foreach&amp;lt;/code&amp;gt;, [[Структура (программирование)|структуры]], передаваемые по значению, автоматическое преобразование встроенных типов в объекты при необходимости (&#039;&#039;boxing&#039;&#039;), атрибуты, встроенные средства взаимодействия с неуправляемым кодом ([[DLL]], [[Component Object Model|COM]]) и прочее.&lt;br /&gt;
&lt;br /&gt;
Кроме того, в C# решено было перенести некоторые возможности C++, отсутствовавшие в Java: беззнаковые типы, [[Перегрузка операторов|перегрузку операторов]] (с некоторыми ограничениями, в отличие от [[C++]]), передача параметров в [[Метод (языки программирования)|метод]] по [[Ссылка (программирование)|ссылке]], методы с переменным числом параметров, оператор &amp;lt;code&amp;gt;[[GOTO|goto]]&amp;lt;/code&amp;gt; (с ограничениями). Также в C# оставили ограниченную возможность работы с [[Указатель (тип данных)|указателями]] — в местах кода, специально обозначенных словом &amp;lt;code&amp;gt;unsafe&amp;lt;/code&amp;gt; и при указании специальной опции [[компилятор]]у.&lt;br /&gt;
&lt;br /&gt;
=== Версия 2.0 ===&lt;br /&gt;
Проект спецификации C# 2.0 впервые был опубликован Microsoft в октябре [[2003 год]]а; в [[2004 год]]у выходили бета-версии (проект с кодовым названием Whidbey), C# 2.0 окончательно вышел [[7 ноября]] [[2005 год]]а вместе с [[Microsoft Visual Studio|Visual Studio]] 2005 и .NET 2.0.&lt;br /&gt;
&lt;br /&gt;
; Новые возможности в версии 2.0&lt;br /&gt;
&lt;br /&gt;
* Частичные типы (разделение реализации класса более чем на один [[файл]]).&lt;br /&gt;
* Обобщённые, или параметризованные типы (&#039;&#039;generics&#039;&#039;). В отличие от [[Шаблоны C++|шаблонов C++]], они поддерживают некоторые дополнительные возможности и работают на уровне [[Виртуальная машина|виртуальной машины]]. Вместе с тем, параметрами обобщённого типа не могут быть выражения, они не могут быть полностью или частично специализированы, не поддерживают шаблонных параметров по умолчанию, от шаблонного параметра нельзя наследоваться, и т. д.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url          = https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/generics/differences-between-cpp-templates-and-csharp-generics&lt;br /&gt;
 |title        = Differences Between C++ Templates and C# Generics (C# Programming Guide)&lt;br /&gt;
 |date         = 2016-12-17&lt;br /&gt;
 |publisher    = [[Microsoft]]&lt;br /&gt;
 |access-date   = 2017-05-16&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |archive-date = 2021-08-07&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20210807210712/https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/differences-between-cpp-templates-and-csharp-generics&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Новая форма [[итератор]]а, позволяющая создавать [[сопрограмма|сопрограммы]] с помощью ключевого слова &amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt;, подобно [[Python]] и [[Ruby]].&lt;br /&gt;
* Анонимные методы, обеспечивающие функциональность [[Замыкание (программирование)|замыкания]].&lt;br /&gt;
* Оператор &#039;&#039;null&#039;&#039;-объединения: &#039;??&#039;: &amp;lt;code&amp;gt;return obj1 ?? obj2;&amp;lt;/code&amp;gt; означает (в нотации C# 1.0) &amp;lt;code&amp;gt;return obj1!=null ? obj1 : obj2;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Обнуляемые (&#039;&#039;nullable&#039;&#039;) типы — значения (обозначаемые вопросительным знаком, например, &amp;lt;code&amp;gt;int? i = null;&amp;lt;/code&amp;gt;), представляющие собой те же самые типы-значения, способные принимать также значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. Такие типы позволяют улучшить взаимодействие с [[Система управления базами данных|базами данных]] через язык [[SQL]].&lt;br /&gt;
* Возможность создавать [[Хранимая процедура|хранимые процедуры]], триггеры и даже типы данных на .Net языках (в том числе и на C#).&lt;br /&gt;
* Поддержка 64-разрядных вычислений, что кроме всего прочего, позволяет увеличить адресное пространство и использовать 64-разрядные [[Примитивный тип|примитивные типы]] данных.&lt;br /&gt;
&lt;br /&gt;
=== Версия 3.0 ===&lt;br /&gt;
В июне 2004 года [[Хейлсберг, Андерс|Андерс Хейлсберг]] впервые рассказал на сайте Microsoft о планируемых расширениях языка в C#3.0&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url          = https://channel9.msdn.com/Blogs/TheChannel9Team/Anders-Hejlsberg-Programming-data-in-C-30&lt;br /&gt;
 |title        = Anders Hejlsberg - Programming data in C# 3.0&lt;br /&gt;
 |date         = 2004-06-16&lt;br /&gt;
 |website      = The Channel 9 Team&lt;br /&gt;
 |publisher    = [[Microsoft]]&lt;br /&gt;
 |access-date   = 2017-05-16&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |archive-date = 2018-11-12&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20181112021339/https://channel9.msdn.com/Blogs/TheChannel9Team/Anders-Hejlsberg-Programming-data-in-C-30&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. В сентябре 2005 года вышли проект спецификации C# 3.0 и бета-версия C# 3.0, устанавливаемая в виде дополнения к существующим Visual Studio 2005 и .NET 2.0. Окончательно эта версия языка вошла в Visual Studio 2008 и .NET 3.5.&lt;br /&gt;
&lt;br /&gt;
; Новые возможности в версии 3.0&lt;br /&gt;
&lt;br /&gt;
В C# 3.0 появились следующие радикальные добавления к языку:&lt;br /&gt;
&lt;br /&gt;
* ключевые слова &amp;lt;code&amp;gt;select, from, where&amp;lt;/code&amp;gt;, позволяющие делать запросы из [[XML]] документов, коллекций {{nobr|и т. п.}} Эти запросы имеют сходство с запросами [[SQL]] и реализуются компонентом [[Language Integrated Query|LINQ]]. (Сама фраза «language integrated query» переводится «запрос, интегрированный в язык».)&lt;br /&gt;
* Инициализация объекта вместе с его свойствами:&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;Customer c = new Customer(); c.Name = &amp;quot;James&amp;quot;; c.Age=30;&amp;lt;/source&amp;gt;&lt;br /&gt;
: можно записать как&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;Customer c = new Customer { Name = &amp;quot;James&amp;quot;, Age = 30 };&amp;lt;/source&amp;gt;&lt;br /&gt;
* [[Лямбда-выражения]]:&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;listOfFoo.Where(delegate(Foo x) { return x.size &amp;gt; 10; });&amp;lt;/source&amp;gt;&lt;br /&gt;
: теперь можно записать как&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;listOfFoo.Where(x =&amp;gt; x.size &amp;gt; 10);&amp;lt;/source&amp;gt;&lt;br /&gt;
* Деревья выражений:&lt;br /&gt;
: лямбда-выражения теперь могут представляться в виде [[Структура данных|структуры данных]], доступной для обхода во время выполнения, тем самым позволяя транслировать строго типизированные C#-выражения в другие домены (например, выражения SQL).&lt;br /&gt;
* Неявная типизация: [[Вывод типов]] локальной переменной. Для неявной типизации вместо названия [[Тип данных|типа данных]] используется ключевое слово &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt;. Затем уже при компиляции компилятор сам выводит тип данных исходя из присвоенного значения:&amp;lt;code&amp;gt;var x = &amp;quot;hello&amp;quot;;&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;string x = &amp;quot;hello&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Анонимные типы: &amp;lt;code&amp;gt;var x = new { Name = &amp;quot;James&amp;quot; };&amp;lt;/code&amp;gt;&lt;br /&gt;
* Методы расширения. Появилась возможность добавления новых методов в уже существующие классы. Реализуется с помощью ключевого слова &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; при первом параметре статической функции статического класса.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public static class StringExtensions&lt;br /&gt;
{&lt;br /&gt;
  public static int ToInt32(this string val)&lt;br /&gt;
  {&lt;br /&gt;
    return Int32.Parse(val);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
// ...&lt;br /&gt;
string s = &amp;quot;10&amp;quot;;&lt;br /&gt;
int x = s.ToInt32();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Автоматические свойства: компилятор сгенерирует закрытое (&#039;&#039;private&#039;&#039;) поле и соответствующие &#039;&#039;аксессор&#039;&#039; и &#039;&#039;мутатор&#039;&#039; для кода вида&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public string Name { get; private set; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
C# 3.0 совместим с C# 2.0 по генерируемому [[Microsoft Intermediate Language|MSIL]]-коду; улучшения в языке — чисто синтаксические и реализуются на этапе компиляции. Например, многие из интегрированных запросов LINQ можно осуществить, используя безымянные делегаты в сочетании с предикатными методами над контейнерами наподобие &amp;lt;code&amp;gt;List.FindAll&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;List.RemoveAll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Версия 4.0 ===&lt;br /&gt;
Превью C# 4.0 было представлено в конце 2008 года, вместе с CTP-версией Visual Studio 2010.&lt;br /&gt;
&lt;br /&gt;
Visual Basic 10.0 и C# 4.0 были выпущены в апреле 2010 года, одновременно с выпуском Visual Studio 2010.&lt;br /&gt;
&lt;br /&gt;
; Новые возможности в версии 4.0&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url          = https://code.msdn.microsoft.com/csharpfuture&lt;br /&gt;
 |title        = Visual Studio 2010: примеры для C# 4.0&lt;br /&gt;
 |date         = 2012-07-17&lt;br /&gt;
 |publisher    = [[Microsoft]]&lt;br /&gt;
 |access-date   = 2017-05-16&lt;br /&gt;
 |archive-date = 2017-02-28&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20170228171714/https://code.msdn.microsoft.com/csharpfuture&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Возможность использования позднего связывания, для использования:&lt;br /&gt;
** с языками с динамической типизацией ([[Python]], [[Ruby]])&lt;br /&gt;
** с COM-объектами&lt;br /&gt;
** отражения (reflection)&lt;br /&gt;
** объектов с изменяемой структурой (DOM). Появляется ключевое слово &amp;lt;code&amp;gt;dynamic&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Именованные и опциональные параметры&lt;br /&gt;
* Новые возможности COM interop&lt;br /&gt;
* [[Ковариантность и контравариантность (программирование)|Ковариантность и контравариантность]] обобщенных интерфейсов и делегатов&lt;br /&gt;
* [[Контрактное программирование|Контракты в коде]] (Code Contracts)&lt;br /&gt;
* Библиотека параллельных задач &#039;&#039;TPL&#039;&#039; (&#039;&#039;Task Parallel Library&#039;&#039;), концепция задач и классы &amp;lt;code&amp;gt;Task&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TaskFactory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Parallel&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен класс &amp;lt;code&amp;gt;MemoryCache&amp;lt;/code&amp;gt;, который предназначен для кэширования контента. Он похож на класс &amp;lt;code&amp;gt;Cache&amp;lt;/code&amp;gt; ASP.NET, но его можно использовать при написании веб- / графических / [[Интерфейс командной строки|консольных приложений]].&lt;br /&gt;
* Добавлено пространство имен &#039;&#039;System.Collections.Concurrent&#039;&#039; и новые классы параллельных коллекций (&#039;&#039;ConcurrentQueue&#039;&#039;, &#039;&#039;ConcurrentStack&#039;&#039;, &#039;&#039;ConcurrentBag&#039;&#039;,…), которые предоставляют не только большую эффективность, но и более полную потокобезопасность.&lt;br /&gt;
&lt;br /&gt;
Примеры:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
dynamic calc = GetCalculator();&lt;br /&gt;
int sum = calc.Add(10, 20); // Динамический вызов&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public void SomeMethod(int x, int y = 5, int z = 7); // Опциональные параметры&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Версия 5.0 ===&lt;br /&gt;
&#039;&#039;&#039;Новые возможности в версии 5.0&#039;&#039;&#039;&lt;br /&gt;
* Шаблон TAP (Task-based Asynchronous Pattern). TAP использует один метод для представления инициализации и завершения асинхронной операции.&lt;br /&gt;
* Асинхронные методы (&amp;lt;code&amp;gt;async&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;await&amp;lt;/code&amp;gt;) — как реализация шаблона TAP.&lt;br /&gt;
* Сведения о вызывающем объекте&lt;br /&gt;
&lt;br /&gt;
=== Версия 6.0 ===&lt;br /&gt;
&#039;&#039;&#039;Новые возможности в версии 6.0&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;null&#039;&#039;-условные операторы. Добавлены новые операторы: &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;?[]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
int? length = customers?.Length; // null if customers is null&lt;br /&gt;
Customer first = customers?[0];  // null if customers is null&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Функции сжатые до выражений (&#039;&#039;expression-bodied functions&#039;&#039;). Теперь определение метода может быть задано с использованием лямбда-синтаксиса:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public Point Move(int dx, int dy) =&amp;gt; new Point(x + dx, y + dy); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Инициализаторы автосвойств. Автосвойства теперь можно инициализировать при объявлении:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public string First { get; set; } = &amp;quot;Jane&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Автосвойства только для чтения. Автосвойства теперь могут быть объявлены без сеттеров:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public string First { get; } = &amp;quot;Jane&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Инициализаторы индексов. Теперь можно инициализировать не только объекты и коллекции, но и словари:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;var numbers = new Dictionary&amp;lt;int, string&amp;gt; {&lt;br /&gt;
    [7] = &amp;quot;seven&amp;quot;,&lt;br /&gt;
    [9] = &amp;quot;nine&amp;quot;,&lt;br /&gt;
    [13] = &amp;quot;thirteen&amp;quot;&lt;br /&gt;
};&amp;lt;/source&amp;gt;&lt;br /&gt;
* [[Интерполяция]] строк. Вместо использования конструкций с &amp;lt;code&amp;gt;String.Format()&amp;lt;/code&amp;gt;, например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var s = String.Format(&amp;quot;{0} is {1} year{{s}} old&amp;quot;, p.Name, p.Age);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
теперь можно размещать код прямо в строке:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var s = $&amp;quot;{p.Name} is {p.Age} year{{s}} old&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Фильтры исключений. Появилась возможность задавать условия для блоков &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
try { … } catch (Exception e) when (Log(e)) { … }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Импорт статических функций типов. Теперь доступ к статическим членам типов возможен без указания полного имени этих членов:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using static System.Console;&lt;br /&gt;
using static System.Math;&lt;br /&gt;
class Program&lt;br /&gt;
{&lt;br /&gt;
    static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        WriteLine(Sqrt(3*3 + 4*4)); &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;nameof&amp;lt;/code&amp;gt;. Новый оператор, который возвращает компактное строковое представление для переданного в качестве аргумента типа:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
WriteLine(nameof(person.Address.ZipCode)); // prints &amp;quot;ZipCode&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Для асинхронного программирования была добавлена возможность использования операторов &amp;lt;code&amp;gt;await&amp;lt;/code&amp;gt; внутри блоков &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;finally&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Resource res = null;&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
    res = await Resource.OpenAsync(…);       // You could do this.&lt;br /&gt;
} &lt;br /&gt;
catch(ResourceException e)&lt;br /&gt;
{&lt;br /&gt;
    await Resource.LogAsync(res, e);         // Now you can do this …&lt;br /&gt;
}&lt;br /&gt;
finally&lt;br /&gt;
{&lt;br /&gt;
    if (res != null) await res.CloseAsync(); // … and this.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Версия 7.0 ===&lt;br /&gt;
&#039;&#039;&#039;Новые возможности в версии 7.0&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;seven&amp;quot; /&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt;-переменные, которые позволяют объявить переменные сразу в вызове метода (причем областью видимости для таких переменных является внешний блок):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;p.GetCoordinates(out int x, out int y);&amp;lt;/source&amp;gt;&lt;br /&gt;
* Сопоставление с шаблоном. Вводится понятие шаблона (&amp;lt;code&amp;gt;pattern&amp;lt;/code&amp;gt;), который представляет собой синтаксическую конструкцию, позволяющую проверить соответствие переменной определённой &#039;&#039;форме&#039;&#039; и извлечь из неё информацию.&lt;br /&gt;
* Шаблоны с &amp;lt;code&amp;gt;is&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;is&amp;lt;/code&amp;gt; теперь может использоваться не только с типом, но и с шаблоном — в качестве правого аргумента)&lt;br /&gt;
* Шаблоны и выражение &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;. Варианты использования &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt; были расширены, теперь можно:&lt;br /&gt;
** использовать любые типы (не только примитивные);&lt;br /&gt;
** использовать шаблоны в выражениях &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt;;&lt;br /&gt;
** добавлять дополнительные условия к выражениям &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt; (используя ключевое слово &amp;lt;code&amp;gt;when&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Кортежи. Добавлен тип &#039;&#039;кортеж значений&#039;&#039; (структура &amp;lt;code&amp;gt;ValueTuple&amp;lt;/code&amp;gt;) и синтаксис работы с данными этого типа:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;(string, string, string) LookupName(long id) // возвращаемый тип - кортеж&lt;br /&gt;
{&lt;br /&gt;
    ... // инициализируем данные&lt;br /&gt;
    return (first, middle, last); // литерал кортежа&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
* Распаковка [[Кортеж (информатика)|кортежей]]. Была добавлена новая синтаксическая конструкция &#039;&#039;деконструктор&#039;&#039;, позволяющая извлечь кортеж, состоящий из членов класса.&lt;br /&gt;
* Локальные функции. Теперь функцию, которая используется только в теле какого-либо метода, можно объявить прямо в теле этого метода.&lt;br /&gt;
* Улучшения литералов. Были добавлены &#039;&#039;бинарные литералы&#039;&#039; и &#039;&#039;символ разделителя &#039;&#039;(&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) в числовых литералах.&lt;br /&gt;
* Локальные переменные и возвращаемые значения по ссылке. Расширена функциональность ключевого слова &amp;lt;code&amp;gt;ref&amp;lt;/code&amp;gt;. Теперь можно возвратить данные из метода или сохранить их в локальной переменной по ссылке.&lt;br /&gt;
* Расширение списка типов, возвращаемых асинхронными методами&lt;br /&gt;
* Больше членов класса в виде выражений. Синтаксис функций, сжатых до выражений (&amp;lt;code&amp;gt;expression-bodied functions&amp;lt;/code&amp;gt;), теперь применим для сеттеров, геттеров, конструкторов и деструкторов.&lt;br /&gt;
* &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt;-выражения. Теперь можно использовать &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; в функциях, сжатых до выражений (&amp;lt;code&amp;gt;expression-bodied functions&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;public string GetLastName() =&amp;gt; throw new NotImplementedException();&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Версия 8.0 ===&lt;br /&gt;
&#039;&#039;&#039;Новые возможности в версии 8.0&#039;&#039;&#039;&amp;lt;ref&amp;gt;{{Cite web|lang=ru|url=https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8|title=Новые возможности C# 8.0|author=|website=|date=|publisher=docs.microsoft.com|access-date=2020-06-11|archive-date=2020-08-08|archive-url=https://web.archive.org/web/20200808191610/https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8|url-status=live}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Модификатор &amp;lt;code&amp;gt;readonly&amp;lt;/code&amp;gt;. Был создан для обозначения члена, который не изменит состояние.&lt;br /&gt;
* Методы интерфейсов по умолчанию. Теперь при создании метода интерфейса можно объявить его реализацию по умолчанию, которую можно переопределить в классе, который реализует этот интерфейс.&lt;br /&gt;
* Сопоставление шаблонов. Возможность позволяет работать с шаблонами в зависимости от формата в связанных, но различных типах данных.&lt;br /&gt;
** Рекурсивные шаблоны. Является выражением шаблона, которое применяется к результатам другого выражения шаблона.&lt;br /&gt;
** Выражения switch позволяют сократить количество case и break, а также фигурных скобок.&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public enum Rainbow&lt;br /&gt;
{&lt;br /&gt;
    Red,&lt;br /&gt;
    Orange,&lt;br /&gt;
    Yellow,&lt;br /&gt;
    Green,&lt;br /&gt;
    Blue,&lt;br /&gt;
    Indigo,&lt;br /&gt;
    Violet&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public static RGBColor FromRainbow(Rainbow colorBand) =&amp;gt;&lt;br /&gt;
    colorBand switch&lt;br /&gt;
    {&lt;br /&gt;
        Rainbow.Red    =&amp;gt; new RGBColor(0xFF, 0x00, 0x00),&lt;br /&gt;
        Rainbow.Orange =&amp;gt; new RGBColor(0xFF, 0x7F, 0x00),&lt;br /&gt;
        Rainbow.Yellow =&amp;gt; new RGBColor(0xFF, 0xFF, 0x00),&lt;br /&gt;
        Rainbow.Green  =&amp;gt; new RGBColor(0x00, 0xFF, 0x00),&lt;br /&gt;
        Rainbow.Blue   =&amp;gt; new RGBColor(0x00, 0x00, 0xFF),&lt;br /&gt;
        Rainbow.Indigo =&amp;gt; new RGBColor(0x4B, 0x00, 0x82),&lt;br /&gt;
        Rainbow.Violet =&amp;gt; new RGBColor(0x94, 0x00, 0xD3),&lt;br /&gt;
        _              =&amp;gt; throw new ArgumentException(message: &amp;quot;invalid enum value&amp;quot;, paramName: nameof(colorBand)),&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Шаблоны свойств. Позволяет сопоставлять свойства исследуемого объекта с помощью &amp;lt;code&amp;gt;{ variable : value } =&amp;gt; ...&amp;lt;/code&amp;gt; .&lt;br /&gt;
** Шаблоны кортежей. Используется, если нужно работать с несколькими наборами входных данных. &amp;lt;code&amp;gt;(value1, value2,..) =&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
* Объявление &amp;lt;code&amp;gt;using&amp;lt;/code&amp;gt;. Это объявление переменной, которому предшествует ключевое слово &amp;lt;code&amp;gt;using&amp;lt;/code&amp;gt;. Оно сообщает компилятору, что объявляемая переменная должна быть удалена в конце [[Область видимости|области видимости]].&lt;br /&gt;
* Статический локальный метод. Теперь можно убедиться в том, что метод не охватывает какие-либо переменные из области видимости с помощью добавления к нему модификатора &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Удаляемые ссылочные структуры. Ссылочные структуры не могут реализовать &amp;lt;code&amp;gt;IDisposable&amp;lt;/code&amp;gt; (как и любые другие интерфейсы). Поэтому чтобы удалить &amp;lt;code&amp;gt;ref struct&amp;lt;/code&amp;gt;, необходим доступный &amp;lt;code&amp;gt;void Dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Типы значений, допускающие значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. Теперь, чтобы указать, что [[переменная типа]] значений допускает значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, необходимо поставить к имени типа &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&lt;br /&gt;
* Асинхронные потоки. Это во-первых интерфейс &amp;lt;code&amp;gt;IAsyncEnumerable&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt;. А во-вторых конструкция &amp;lt;code&amp;gt;foreach&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;await&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public static async System.Collections.Generic.IAsyncEnumerable&amp;lt;int&amp;gt; GenerateSequence()&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; 20; i++)&lt;br /&gt;
    {&lt;br /&gt;
        await Task.Delay(100);&lt;br /&gt;
        yield return i;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// or&lt;br /&gt;
await foreach (var number in GenerateSequence())&lt;br /&gt;
{&lt;br /&gt;
    Console.WriteLine(number);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Асинхронные высвобождаемые типы. Начиная с C# 8.0 язык поддерживает асинхронные освобождаемые типы, реализующие интерфейс &amp;lt;code&amp;gt;System.IAsyncDisposable&amp;lt;/code&amp;gt;. Операнд выражения &amp;lt;code&amp;gt;using&amp;lt;/code&amp;gt; может реализовывать &amp;lt;code&amp;gt;IDisposable&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;IAsyncDisposable&amp;lt;/code&amp;gt;. В случае &amp;lt;code&amp;gt;IAsyncDisposable&amp;lt;/code&amp;gt; компилятор создает код для &amp;lt;code&amp;gt;await&amp;lt;/code&amp;gt;, возвращенного &amp;lt;code&amp;gt;Task&amp;lt;/code&amp;gt; из &amp;lt;code&amp;gt;IAsyncDisposable.DisposeAsync&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Индексы и диапазоны. Диапазоны и индексы обеспечивают лаконичный синтаксис для доступа к отдельным элементам или диапазонам в последовательности. Нововведение включает в себя операторы &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; , а также &amp;lt;code&amp;gt;System.Index&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;System.Range&amp;lt;/code&amp;gt;&lt;br /&gt;
* Оператор присваивания объединения с null. Оператор &amp;lt;code&amp;gt;??=&amp;lt;/code&amp;gt; можно использовать для присваивания значения правого операнда левому операнду только в том случае, если левый операнд имеет значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
List&amp;lt;int&amp;gt; numbers = null;&lt;br /&gt;
int? i = null;&lt;br /&gt;
&lt;br /&gt;
numbers ??= new List&amp;lt;int&amp;gt;();&lt;br /&gt;
numbers.Add(i ??= 17);&lt;br /&gt;
numbers.Add(i ??= 20);&lt;br /&gt;
&lt;br /&gt;
Console.WriteLine(string.Join(&amp;quot; &amp;quot;, numbers));  // output: 17 17&lt;br /&gt;
Console.WriteLine(i);  // output: 17&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Неуправляемые сконструированные типы. Начиная с C# 8.0, сконструированный тип значения является неуправляемым, если он содержит поля исключительно неуправляемых типов (например универсальный тип &amp;lt;T&amp;gt;).&lt;br /&gt;
* Выражение stackalloc во вложенных выражениях. Теперь если результат выражения stackalloc имеет тип &amp;lt;code&amp;gt;System.Span&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;System.ReadOnlySpan&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt;, то его можно использовать в других выражениях.&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Span&amp;lt;int&amp;gt; numbers = stackalloc[] { 1, 2, 3, 4, 5, 6 };&lt;br /&gt;
var ind = numbers.IndexOfAny(stackalloc[] { 2, 4, 6, 8 });&lt;br /&gt;
Console.WriteLine(ind);  // output: 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Порядок маркеров &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt; в интерполированных строках verbatim теперь может быть любым.&lt;br /&gt;
&lt;br /&gt;
=== Версия 9.0 ===&lt;br /&gt;
&#039;&#039;&#039;Новые возможности в версии 9.0&#039;&#039;&#039;&amp;lt;ref&amp;gt;{{Cite web|lang=ru|url=https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-9|title=Новые возможности C# 9.0|author=|website=|date=|publisher=docs.microsoft.com|access-date=2023-04-29|archive-date=2022-12-08|archive-url=https://web.archive.org/web/20221208095439/https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-9|url-status=live}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Типы записей. Появилась возможность при помощи ключевого слова &amp;lt;code&amp;gt;record&amp;lt;/code&amp;gt; для определения ссылочного типа, предоставляющего функционал инкапсуляции данных. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;public record Person(string FirstName, string LastName);&amp;lt;/syntaxhighlight&amp;gt; По умолчанию типы записей является неизменяемыми. В отличие от других ссылочных типов, переменные типов записей считаются равными, если равны типы и значения их свойств и полей.&lt;br /&gt;
** Обратимые изменения. Для заданного экземпляра записи при помощи ключевого слова &amp;lt;code&amp;gt;with&amp;lt;/code&amp;gt; возможно создание копии с изменёнными значениями указанных свойств и полей.&lt;br /&gt;
** Запись может быть унаследована от записи. Однако запись не может быть унаследована от класса, и наоборот, класс не может быть унаследован от записи.&lt;br /&gt;
* Инициализаторы. C# 9.0 предоставляет синтаксис — ключевое слово &amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt; — для задания значений свойств класса при инициализации. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public class Person&lt;br /&gt;
{&lt;br /&gt;
    public string FirstName { get; init; }&lt;br /&gt;
    public string LastName { get; init; }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Операторы верхнего уровня. Один файл в приложении допускается начать сразу с исполняемых строк кода, минуя ряд таких формальностей, как объявление [[Пространство имён (программирование)|пространств имён]], [[Класс (программирование)|классов]], [[Метод (программирование)|методов]]. Такие операторы эквивалентны операторам метода &amp;lt;code&amp;gt;Main&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Улучшения сопоставлений шаблонов.&lt;br /&gt;
** Шаблоны типов — соответствуют объекту заданного типа.&lt;br /&gt;
** Логические шаблоны — входные данные должны соответствовать заданной логической операции (&amp;lt;code&amp;gt;and&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;or&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;not&amp;lt;/code&amp;gt;).&lt;br /&gt;
** Реляционные шаблоны — входные данные должны соответствовать заданной операции сравнения (больше, меньше, равно, больше или равно, меньше или равно) с константой.&lt;br /&gt;
* Улучшения производительности.&lt;br /&gt;
* Допускается опустить тип создаваемого объекта в выражении &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;, если он известен заранее &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
private List&amp;lt;Person&amp;gt; persons = new();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Поддержка статических [[Лямбда-выражение|лямбда-выражений]] и статических [[Анонимная функция|анонимных методов]]. Как и статические локальные функции, они не могут захватывать нестатические локальные переменные и состояния экземпляра.&lt;br /&gt;
* Поддержка применения атрибутов к локальным функциям.&lt;br /&gt;
&lt;br /&gt;
=== Версия 10.0 ===&lt;br /&gt;
&#039;&#039;&#039;Новые возможности в версии 10.0&#039;&#039;&#039;&amp;lt;ref&amp;gt;{{Cite web|lang=ru|url=https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-10|title=Новые возможности C# 10.0|author=|website=|date=|publisher=docs.microsoft.com|access-date=2023-04-11|archive-date=2022-12-08|archive-url=https://web.archive.org/web/20221208095439/https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-10|url-status=live}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Глобальные импорты. С помощью ключевого слова &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; появилась возможность определить пространства имён, которые будут импортированы глобально во всех файлах проекта. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
global using System;&lt;br /&gt;
global using System.Collections.Generic;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Файловая область видимости пространства имён. Объявление пространства имён может быть применено ко всему файлу, что уменьшает уровень отступов в коде. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
namespace MyNamespace;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Усовершенствованные структуры. Добавлены улучшения в работу со структурами, в том числе возможность инициализации полей непосредственно в теле структуры и поддержка параметров по умолчанию. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public struct Point&lt;br /&gt;
{&lt;br /&gt;
    public int X { get; set; } = 0;&lt;br /&gt;
    public int Y { get; set; } = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Запечатанные интерфейсы. Интерфейсы могут быть объявлены как &amp;lt;code&amp;gt;sealed&amp;lt;/code&amp;gt;, что предотвращает их реализацию другими интерфейсами. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;public sealed interface IMyInterface { }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Усовершенствованные операторы и литералы. Поддержка with-оператора для структурных типов, улучшенные string-интерполяции и другие синтаксические улучшения.&lt;br /&gt;
* Улучшенное сопоставление шаблонов. Добавлены новые возможности для сопоставления шаблонов, включая шаблоны списков и возможность использования шаблонов в операторах &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
int[] numbers = { 1, 2, 3, 4, 5 };&lt;br /&gt;
bool isThreeElementArray = numbers is [_, _, _];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Поддержка записи структуры и членов записи. Улучшена производительность при использовании структурных типов с поддержкой записи. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;public record struct Point(int X, int Y);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Усовершенствованные атрибуты. Возможность применения атрибутов к более широкому кругу элементов, таких как локальные функции и выражения. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[MyCustom]&lt;br /&gt;
void LocalFunction() { }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Лямбда-выражения. Поддержка более мощных и гибких лямбда-выражений, включая использование типов возврата и деструктуризацию. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;var increment = (int x) =&amp;gt; x + 1;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Усовершенствованные &amp;lt;code&amp;gt;async/await&amp;lt;/code&amp;gt;. Улучшена работа с асинхронными методами, включая более эффективное управление памятью и потоками.&lt;br /&gt;
&lt;br /&gt;
=== Версия 11.0 ===&lt;br /&gt;
&#039;&#039;&#039;Новые возможности в версии 11.0&#039;&#039;&#039;&amp;lt;ref&amp;gt;{{Cite web|lang=ru|url=https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-11|title=Новые возможности C# 11.0|author=|website=|date=|publisher=docs.microsoft.com|access-date=2024-06-01|archive-date=2023-12-20|archive-url=https://web.archive.org/web/20231220123456/https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-11|url-status=live}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Статические виртуальные элементы в интерфейсах. Интерфейсы теперь могут включать статические виртуальные и абстрактные члены, что позволяет перегружать операторы и определять статические свойства и методы. Это упрощает реализацию универсальных математических операций. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public interface IMyInterface&amp;lt;TSelf, TOther, TResult&amp;gt; &lt;br /&gt;
    where TSelf : IMyInterface&amp;lt;TSelf, TOther, TResult&amp;gt; &lt;br /&gt;
{ &lt;br /&gt;
    static abstract TResult operator +(TSelf left, TOther right); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Проверяемые и непроверяемые операторы. Разработчики могут определять &amp;lt;code&amp;gt;checked&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;unchecked&amp;lt;/code&amp;gt; арифметические операторы, что позволяет компилятору вызывать правильный вариант на основе контекста. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public static checked int operator +(MyType left, MyType right)&lt;br /&gt;
{&lt;br /&gt;
    left.Value + right.Value; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Оператор unsigned right-shift. Введен новый оператор &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;, который выполняет сдвиг вправо без знака, упрощая работу с целочисленными типами. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
int result = -8 &amp;gt;&amp;gt;&amp;gt; 2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ослабленные требования к операторам смены. Второй операнд оператора сдвига больше не обязан быть типа &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, что делает использование универсальных математических интерфейсов более гибким. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MyType value = new MyType();&lt;br /&gt;
value &amp;gt;&amp;gt;= 3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Поддержка универсальной математики. Новые интерфейсы, такие как &amp;lt;code&amp;gt;System.IAdditionOperators&amp;lt;TSelf, TOther, TResult&amp;gt;&amp;lt;/code&amp;gt;, позволяют типам реализовывать математические операции более последовательно и удобно. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public struct MyNumber : IAdditionOperators&amp;lt;MyNumber, MyNumber, MyNumber&amp;gt; &lt;br /&gt;
{ &lt;br /&gt;
    public static MyNumber operator +(MyNumber left, MyNumber right)&lt;br /&gt;
    {&lt;br /&gt;
        new MyNumber(left.Value + right.Value);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Расширенные возможности инициализации типов. Теперь можно задавать значения полей прямо в теле структуры и использовать параметры по умолчанию. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public struct Point &lt;br /&gt;
{ &lt;br /&gt;
    public int X { get; set; } = 0; &lt;br /&gt;
    public int Y { get; set; } = 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Версия 12.0 ===&lt;br /&gt;
&#039;&#039;&#039;Новые возможности в версии 12.0&#039;&#039;&#039;&amp;lt;ref&amp;gt;{{Cite web|lang=ru|url=https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-12|title=Новые возможности C# 12.0|author=|website=|date=|publisher=docs.microsoft.com|access-date=2024-03-03|archive-date=2023-12-21|archive-url=https://web.archive.org/web/20231221123456/https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-12|url-status=live}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Статические абстрактные и виртуальные методы в интерфейсах. Интерфейсы теперь могут содержать статические абстрактные и виртуальные методы, что позволяет определять поведение для универсальных математических операций. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public interface IMyInterface&amp;lt;TSelf, TOther, TResult&amp;gt; &lt;br /&gt;
    where TSelf : IMyInterface&amp;lt;TSelf, TOther, TResult&amp;gt; &lt;br /&gt;
{ &lt;br /&gt;
    static abstract TResult operator +(TSelf left, TOther right); &lt;br /&gt;
    static virtual TResult Add(TSelf left, TOther right) &lt;br /&gt;
    {&lt;br /&gt;
        return left + right;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Поддержка коллекций с неизменяемыми элементами. Введена новая коллекция &amp;lt;code&amp;gt;ImmutableArray&amp;lt;/code&amp;gt;, которая обеспечивает неизменяемость элементов и повышение производительности. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
var immutableArray = ImmutableArray.Create(1, 2, 3, 4);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Улучшенные структуры данных. В C# 12 введены новые типы данных, такие как &amp;lt;code&amp;gt;readonly struct&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;ref readonly struct&amp;lt;/code&amp;gt;, для оптимизации работы с памятью. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public readonly struct Point &lt;br /&gt;
{ &lt;br /&gt;
    public int X { get; } &lt;br /&gt;
    public int Y { get; }&lt;br /&gt;
&lt;br /&gt;
    public Point(int x, int y) &lt;br /&gt;
    {&lt;br /&gt;
        X = x;&lt;br /&gt;
        Y = y;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Расширенные возможности для типов записи. Теперь записи поддерживают наследование и могут содержать методы с телами. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public record Person(string Name) &lt;br /&gt;
{ &lt;br /&gt;
    public virtual string GetName() =&amp;gt; Name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public record Employee(string Name, int EmployeeId) : Person(Name) &lt;br /&gt;
{ &lt;br /&gt;
    public override string GetName() =&amp;gt; $&amp;quot;{Name} (ID: {EmployeeId})&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Поддержка типов с произвольным количеством параметров. Введены новые методы для работы с переменным числом параметров, упрощая использование таких типов в коде. &amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public void PrintValues(params int[] values) &lt;br /&gt;
{ &lt;br /&gt;
    foreach (var value in values) &lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(value);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PrintValues(1, 2, 3, 4);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Расширенные возможности компилятора. В C# 12 компилятор получил новые возможности для оптимизации и проверки кода, включая улучшенную поддержку анализаторов и генераторов исходного кода.&lt;br /&gt;
&lt;br /&gt;
== Пример «Hello, World!» ==&lt;br /&gt;
Ниже представлен код классической программы «[[программа Hello world|Hello world]]» на C# для консольного приложения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;Console.WriteLine(&amp;quot;Hello World!&amp;quot;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и код этой же программы для приложения Windows Forms:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
namespace WindowsForms;&lt;br /&gt;
&lt;br /&gt;
public class Program&lt;br /&gt;
{&lt;br /&gt;
    [STAThread]&lt;br /&gt;
    public static void Main() =&amp;gt; new DemoForm().ShowDialog();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class DemoForm : Form&lt;br /&gt;
{&lt;br /&gt;
    Label label = new Label();&lt;br /&gt;
&lt;br /&gt;
    public DemoForm()&lt;br /&gt;
    {&lt;br /&gt;
        label.Text = &amp;quot;Hello World!&amp;quot;;&lt;br /&gt;
        this.Controls.Add(label);&lt;br /&gt;
        this.StartPosition = FormStartPosition.CenterScreen;&lt;br /&gt;
        this.BackColor = Color.White;&lt;br /&gt;
        this.FormBorderStyle = FormBorderStyle.Fixed3D;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализации ==&lt;br /&gt;
Существует несколько реализаций C#:&lt;br /&gt;
* Компилятор [[Roslyn (компилятор)|Roslyn]] c открытым [https://github.com/dotnet/roslyn исходным кодом]&lt;br /&gt;
* Реализация C# в виде компилятора csc.exe включена в состав [[.NET Framework]] (включая [[.NET Micro Framework]], [[.NET Compact Framework]] и его реализации под [[Silverlight]] и [[Windows Phone 7]]).&lt;br /&gt;
* В составе проекта Rotor ([[Shared Source Common Language Infrastructure]]) [[Microsoft|компании Microsoft]].&lt;br /&gt;
* Проект [[Mono]] включает в себя реализацию C# с открытым [[Исходный код|исходным кодом]].&lt;br /&gt;
* Проект [[DotGNU]] также включает компилятор C# с открытым кодом.&lt;br /&gt;
* [[DotNetAnywhere]]&amp;lt;ref&amp;gt;{{Cite web |url=http://dotnetanywhere.org/ |title=Dot Net Anywhere&amp;lt;!-- Заголовок добавлен ботом --&amp;gt; |access-date=2009-03-05 |archive-date=2009-05-04 |archive-url=https://web.archive.org/web/20090504004555/http://dotnetanywhere.org/ |url-status=live }}&amp;lt;/ref&amp;gt; — ориентированная на [[Встраиваемая система|встраиваемые]] системы реализация CLR, поддерживает практически всю спецификацию C# 2.0.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания|2}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = C# для профессионалов: тонкости программирования, 3-е издание, новый перевод &lt;br /&gt;
|оригинал = C# in Depth, 3rd ed. &lt;br /&gt;
|автор = Джон Скит &lt;br /&gt;
|страниц = 608 &lt;br /&gt;
|isbn = 978-5-8459-1909-0 &lt;br /&gt;
|год = 2014&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]] &lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = C# 5.0 и платформа .NET 4.5 для профессионалов &lt;br /&gt;
|оригинал = Professional C# 5.0 and .NET 4.5 &lt;br /&gt;
|автор = Кристиан Нейгел и др.&lt;br /&gt;
|страниц = 1440 &lt;br /&gt;
|isbn = 978-5-8459-1850-5 &lt;br /&gt;
|год = 2013 &lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]] &lt;br /&gt;
}}&lt;br /&gt;
* {{книга &lt;br /&gt;
|заглавие = Язык программирования C#. Классика Computers Science. 4-е издание &lt;br /&gt;
|ссылка = http://www.piter.com/book.phtml?978545900283 &lt;br /&gt;
|оригинал = C# Programming Language (Covering C# 4.0), 4th Ed &lt;br /&gt;
|автор = А. Хейлсберг, М. Торгерсен, С. Вилтамут, П. Голд &lt;br /&gt;
|страниц = 784 &lt;br /&gt;
|isbn = 978-5-459-00283-6 &lt;br /&gt;
|год = 2012 &lt;br /&gt;
|место = СПб. &lt;br /&gt;
|издательство = [[Питер (издательство)|«Питер»]] &lt;br /&gt;
|archive-url=https://web.archive.org/web/20111010180115/http://www.piter.com/book.phtml?978545900283|archive-date=2011-10-10}}&lt;br /&gt;
* {{книга&lt;br /&gt;
 |заглавие         = Изучаем C#. 2-е издание&lt;br /&gt;
 |ссылка             = http://www.piter.com/book.phtml?978544610105&lt;br /&gt;
 |оригинал         = Head First C#, 2ed&lt;br /&gt;
 |автор               = Э. Стиллмен, Дж. Грин&lt;br /&gt;
 |страниц           = 704&lt;br /&gt;
 |isbn                     = 978-5-4461-0105-4&lt;br /&gt;
 |год                   = 2012&lt;br /&gt;
 |место               = СПб.&lt;br /&gt;
 |издательство = [[Питер (издательство)|«Питер»]]&lt;br /&gt;
}}{{Недоступная ссылка|date=2018-08|bot=InternetArchiveBot }}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Язык программирования C# 5.0 и платформа .NET 4.5, 6-е издание &lt;br /&gt;
|ссылка = http://www.williamspublishing.com/Books/978-5-8459-1814-7.html&lt;br /&gt;
|оригинал = Pro C# 5.0 and the .NET 4.5 Framework, 6th edition &lt;br /&gt;
|автор = Эндрю Троелсен &lt;br /&gt;
|страниц = 1312 &lt;br /&gt;
|isbn = 978-5-8459-1814-7 &lt;br /&gt;
|год = 2013 &lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]] &lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = C# 6.0. Справочник. Полное описание языка&lt;br /&gt;
|оригинал = C# 6.0 in a Nutshell: The Definitive Reference&lt;br /&gt;
|автор = Джозеф Албахари, Бен Албахари&lt;br /&gt;
|страниц = 1040&lt;br /&gt;
|ссылка = http://www.williamspublishing.com/Books/978-5-8459-2087-4.html&lt;br /&gt;
|isbn = 978-5-8459-2087-4&lt;br /&gt;
|isbn2 = 978-1-491-92706-9&lt;br /&gt;
|год = 2018&lt;br /&gt;
|место = М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = C# 4.0: полное руководство&lt;br /&gt;
|оригинал = C# 4.0 The Complete Reference &lt;br /&gt;
|автор = Герберт Шилдт.&lt;br /&gt;
|ссылка = &lt;br /&gt;
|страницы = 1056&lt;br /&gt;
|isbn = 978-5-8459-1684-6&lt;br /&gt;
|год = 2010&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Visual C# 2010: полный курс&lt;br /&gt;
|оригинал = Beginning Microsoft Visual C# 2010&lt;br /&gt;
|автор = Кристиан Нейгел, Карли Уотсон и др.&lt;br /&gt;
|isbn = 978-5-8459-1699-0&lt;br /&gt;
|год = 2010&lt;br /&gt;
|место = М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|Диалектика]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{Навигация}}&lt;br /&gt;
* [http://msdn.microsoft.com/ru-ru/vcsharp/default.aspx Основные материалы по Visual C# ]&lt;br /&gt;
* [http://msdn.microsoft.com/ru-ru/library/67ef8sbd.aspx Руководство по программированию на C# ]&lt;br /&gt;
* [http://msdn.microsoft.com/ru-ru/library/ms186214.aspx Язык C# (инструкции по C#) ]&lt;br /&gt;
* [http://msdn.microsoft.com/ru-ru/library/360kwx3z.aspx Практическое руководство. Создание приложений Windows Forms на C# ]&lt;br /&gt;
* [https://web.archive.org/web/20110228024835/http://www.techdays.ru/videos/2669.html Доклад, подробно описывающий новшества в языке С# версии 4.0 ]&lt;br /&gt;
&lt;br /&gt;
{{ВС}}&lt;br /&gt;
{{C Sharp}}&lt;br /&gt;
{{dotNET}}&lt;br /&gt;
{{Ecma International Standards}}&lt;br /&gt;
{{Стандарты ISO}}&lt;br /&gt;
{{Язык программирования Си}}&lt;br /&gt;
{{Microsoft Research}}&lt;br /&gt;
{{Свободное и открытое программное обеспечение Microsoft}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Семейство языков программирования C Sharp]]&lt;br /&gt;
[[Категория:Языки программирования семейства Си]]&lt;br /&gt;
[[Категория:Языки программирования платформы .NET]]&lt;br /&gt;
[[Категория:Языки веб-программирования]]&lt;br /&gt;
[[Категория:Языки программирования с автоматическим управлением памятью]]&lt;br /&gt;
[[Категория:Высокоуровневые языки программирования]]&lt;/div&gt;</summary>
		<author><name>31.41.59.210</name></author>
	</entry>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=Java&amp;diff=1647</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=Java&amp;diff=1647"/>
		<updated>2026-03-22T08:19:36Z</updated>

		<summary type="html">&lt;p&gt;31.41.59.210: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{о|языке программирования|прикладной платформе на основе данного языка|Java (программная платформа)}}&lt;br /&gt;
{{не путать|JavaScript}}&lt;br /&gt;
{{Карточка языка программирования&lt;br /&gt;
| логотип = [[Файл:Java logo.svg|121px]]&lt;br /&gt;
| класс = [[Java Virtual Machine#Среда исполнения|язык JVM]], [[мультипарадигменный язык программирования|мультипарадигменный]]: [[объектно-ориентированное программирование|объектно-ориентированный]],&lt;br /&gt;
[[аспектно-ориентированное программирование|аспектно-ориентированный]],&lt;br /&gt;
[[обобщённое программирование|обобщённый]], [[Отражение (программирование)|рефлективный]]&lt;br /&gt;
| дата выпуска = [[23 мая]] [[1995 год|1995]]&lt;br /&gt;
| расширение = .java, .class, [[JAR|.jar]], .jad, .jmod, [[WAR (тип файла)|.war]], [[EAR|.ear]]&lt;br /&gt;
| последняя версия = Java SE 24&amp;lt;ref&amp;gt;{{Cite web|title=Oracle Releases Java 24|url=https://www.oracle.com/news/announcement/oracle-releases-java-24-2025-03-18/|access-date=2025-03-27}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
| дата выпуска последней версии = 18.03.2025&lt;br /&gt;
| повлиял на = [[Ада (язык программирования)|Ada]], [[C Sharp|C#]], [[Chapel (язык программирования)|Chapel]], [[Clojure]], [[ECMAScript]], [[Fantom]], [[Gambas]], [[Groovy]], [[Hack (язык программирования)|Hack]], [[Haxe]], [[Visual J Sharp|J#]], [[Kotlin]], [[PHP]], [[Python]], [[Scala (язык программирования)|Scala]], [[Seed7]], [[Vala]], [[JavaScript]]&lt;br /&gt;
| сайт = https://java.com&lt;br /&gt;
| Последняя версия = Java SE 24&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Java&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;прим.&amp;quot;&amp;gt;Произносится на английском как {{IPA|/ˈdʒɑːvə/}}, «Джава». В русском языке помимо «Джава» встречается транслитерация «Ява», но правообладатели торговой марки предпочитают первую транслитерацию.&amp;lt;/ref&amp;gt; — [[сильная и слабая типизация|строго]] [[статическая типизация|типизированный]] [[объектно-ориентированный язык программирования]] общего назначения, разработанный компанией [[Sun Microsystems]] (в последующем приобретённой компанией [[Oracle]]). Разработка ведётся сообществом, организованным через [[Java Community Process]]; язык и основные реализующие его технологии распространяются по лицензии [[GPL]]. Права на [[Торговая марка|торговую марку]] принадлежат корпорации [[Oracle]].&lt;br /&gt;
&lt;br /&gt;
Приложения Java обычно [[транслятор|транслируются]] в специальный [[байт-код]], поэтому они могут работать на любой [[Компьютерная архитектура|компьютерной архитектуре]], для которой существует реализация [[Java Virtual Machine|виртуальной Java-машины]]. Дата официального выпуска — 23 мая 1995 года. Java занимает высокие места в рейтингах популярности языков программирования (2-е место в рейтингах [[IEEE Spectrum]] (2020)&amp;lt;ref&amp;gt;{{Cite news|title=Top Programming Languages 2020|url=https://spectrum.ieee.org/at-work/tech-careers/top-programming-language-2020|work=IEEE Spectrum|access-date=2021-02-14|language=en|archive-date=2021-01-18|archive-url=https://web.archive.org/web/20210118190122/https://spectrum.ieee.org/at-work/tech-careers/top-programming-language-2020}}&amp;lt;/ref&amp;gt; и [[Индекс TIOBE|TIOBE]] (2021&amp;lt;ref&amp;gt;{{Cite web|url=https://www.tiobe.com/tiobe-index/|title=TIOBE Index {{!}} TIOBE — The Software Quality Company|publisher=www.tiobe.com|access-date=2018-11-19|archive-date=2018-02-25|archive-url=https://web.archive.org/web/20180225101948/https://www.tiobe.com/tiobe-index/|url-status=live}}&amp;lt;/ref&amp;gt;)).&lt;br /&gt;
&lt;br /&gt;
== История создания ==&lt;br /&gt;
[[Файл:James Gosling 2008.jpg|thumb|[[Гослинг, Джеймс|Джеймс Гослинг]]]]&lt;br /&gt;
Изначально язык назывался Oak («Дуб»), разрабатывался [[Гослинг, Джеймс|Джеймсом Гослингом]] для программирования бытовых электронных устройств. Из-за того, что язык с таким названием уже существовал, Oak был переименован в Java&amp;lt;ref&amp;gt;{{Книга|автор=Buyya|заглавие=Object-oriented Programming with Java: Essentials and Applications|ссылка=https://books.google.ru/books?id=rXGMFYXFDwMC&amp;amp;pg=PA34&amp;amp;dq=James+gosling+oak&amp;amp;hl=ru&amp;amp;sa=X&amp;amp;ved=0ahUKEwiB9PfT-s3eAhXMqIsKHSC7BIkQ6AEILDAA|издательство=Tata McGraw-Hill Education|год=2009|страниц=678|isbn=9780070669086|access-date=2018-11-12|archive-date=2018-11-12|archive-url=https://web.archive.org/web/20181112101707/https://books.google.ru/books?id=rXGMFYXFDwMC&amp;amp;pg=PA34&amp;amp;dq=James+gosling+oak&amp;amp;hl=ru&amp;amp;sa=X&amp;amp;ved=0ahUKEwiB9PfT-s3eAhXMqIsKHSC7BIkQ6AEILDAA#v=onepage&amp;amp;q=James%20gosling%20oak&amp;amp;f=false|url-status=live}}&amp;lt;/ref&amp;gt;. Назван в честь марки [[кофе]] Java, которая, в свою очередь, получила наименование одноимённого острова ([[Ява]]), поэтому на официальной эмблеме языка изображена чашка с горячим кофе. Существует и другая версия происхождения названия языка, связанная с [[Аллюзия|аллюзией]] на кофемашину как пример бытового устройства, для программирования которого изначально язык создавался. В соответствии с этимологией в русскоязычной литературе с конца двадцатого и до первых лет двадцать первого века название языка нередко переводилось как Ява, а не транскрибировалось.&lt;br /&gt;
&lt;br /&gt;
В результате работы проекта мир увидел принципиально новое устройство, [[карманный персональный компьютер]] Star7&amp;lt;ref&amp;gt;{{Cite web |url=https://temofeev.ru/info/articles/star7-s-chego-nachinalas-java/ |title=Star7: с чего начиналась Java |access-date=2022-10-02 |archive-date=2022-10-02 |archive-url=https://web.archive.org/web/20221002075116/https://temofeev.ru/info/articles/star7-s-chego-nachinalas-java/ |url-status=live }}&amp;lt;/ref&amp;gt;, который опередил своё время более чем на 10 лет, но из-за большой стоимости в 50 долларов не смог произвести переворот в мире технологии и был забыт.&lt;br /&gt;
&lt;br /&gt;
Устройство Star7 не пользовалось популярностью, в отличие от языка программирования Java и его окружения. Следующим этапом жизни языка стала разработка интерактивного телевидения. Однако в 1994 году стало очевидным, что интерактивное телевидение было ошибкой.&lt;br /&gt;
&lt;br /&gt;
С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и [[Сервер (программное обеспечение)|серверного]] программного обеспечения. Тогда же определённое распространение получила технология [[Java-апплет]]ов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей [[Динамический сайт|динамических веб-страниц]] в 2000-е годы технология стала применяться редко.&lt;br /&gt;
&lt;br /&gt;
В [[Веб-разработка|веб-разработке]] применяется [[Spring Framework]]; для документирования используется утилита [[Javadoc]].&lt;br /&gt;
&lt;br /&gt;
== Основные особенности языка ==&lt;br /&gt;
Программы на Java [[транслятор|транслируются]] в [[байт-код Java]], выполняемый [[Java Virtual Machine|виртуальной машиной Java]] (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как [[интерпретатор]].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Duke (Java mascot) waving.svg|thumb|150px|Дюк — талисман Java]]&lt;br /&gt;
&lt;br /&gt;
Достоинством подобного способа выполнения программ является полная независимость байт-кода от [[Операционная система|операционной системы]] и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером), вызывают немедленное прерывание.&lt;br /&gt;
&lt;br /&gt;
Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований немного увеличил скорость выполнения программ на Java:&lt;br /&gt;
* применение технологии трансляции [[Байт-код Java|байт-кода]] в [[машинный код]] непосредственно во время работы программы ([[JIT]]-технология) с возможностью сохранения версий класса в машинном коде,&lt;br /&gt;
* обширное использование [[платформенно-ориентированный код|платформенно-ориентированного кода]] (native-код) в стандартных библиотеках,&lt;br /&gt;
* аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология [[Jazelle]], поддерживаемая некоторыми процессорами [[ARM (архитектура)|архитектуры ARM]]).&lt;br /&gt;
&lt;br /&gt;
По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, но при этом в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее&amp;lt;ref name=&amp;quot;slow_java&amp;quot;&amp;gt;{{Cite web |url=http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&amp;amp;lang=java |title=Java 6 -server speed ÷ C++ GNU g++ speed {{!}} Computer Language Benchmarks Game |access-date=2010-03-04 |archive-url=https://web.archive.org/web/20110614210615/http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&amp;amp;lang=java |archive-date=2011-06-14 |url-status=dead }}&amp;lt;/ref&amp;gt;. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10—30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией [[Google (компания)|Google]], согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на [[C++]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = https://www.theregister.co.uk/2011/06/03/google_paper_on_cplusplus_java_scala_go/&lt;br /&gt;
 |title       = Google pits C++ against Java, Scala, and Go&lt;br /&gt;
 |author      = Metz, Cade&lt;br /&gt;
 |date        = 2011-06-03&lt;br /&gt;
 |work        =&lt;br /&gt;
 |publisher   = [[The Register]]&lt;br /&gt;
 |access-date  = 2011-06-05&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170nFPxZ?url=http://www.theregister.co.uk/2011/06/03/google_paper_on_cplusplus_java_scala_go/&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf Loop Recognition in C++/Java/Go/Scala]{{Refsize|0.3}} {{Wayback|url=https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf |date=20111116151424 }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web |url=http://www.opennet.ru/opennews/art.shtml?num=30784 |title=В Google провели сравнение производительности C++, Java, Go и Scala |access-date=2011-06-05 |archive-date=2011-06-08 |archive-url=https://web.archive.org/web/20110608232010/http://www.opennet.ru/opennews/art.shtml?num=30784 |url-status=live }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author      = Robert Tolksdorf.&lt;br /&gt;
 |url         = http://www.is-research.de/info/vmlanguages/&lt;br /&gt;
 |title       = Programming languages for the Java Virtual Machine JVM&lt;br /&gt;
 |publisher   = is-research GmbH&lt;br /&gt;
 |access-date  = 2009-06-05&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Онлайн-каталог альтернативных языков и языковых расширений для JVM&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170nqDc9?url=http://www.is-research.de/info/vmlanguages/&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры [[Common Language Infrastructure|CLI]], заложенной в основу платформы [[.NET Framework|.NET]] компанией [[Microsoft]].&lt;br /&gt;
&lt;br /&gt;
== Классификация платформ Java ==&lt;br /&gt;
Внутри Java существует несколько основных семейств технологий:&lt;br /&gt;
* [[Java SE]] — Java Standard Edition — основное издание Java. Содержит компиляторы, [[API]], [[Java Runtime Environment]]; подходит для создания пользовательских приложений, в первую очередь — для настольных систем.&lt;br /&gt;
* [[Jakarta EE]] (ранее — Java EE (Enterprise Edition)) представляет собой набор спецификаций для создания [[программное обеспечение|ПО]] уровня предприятия. В 2017-м проект Java EE был передан [[Eclipse Foundation]], и тогда же его наименование изменилось на текущее&amp;lt;ref&amp;gt;{{Cite news|title=Opening Up Java EE - An Update|first=David|last=Delabassee|url=https://blogs.oracle.com/theaquarium/opening-up-ee-update|access-date=2018-11-25|archive-date=2018-11-26|archive-url=https://web.archive.org/web/20181126010151/https://blogs.oracle.com/theaquarium/opening-up-ee-update}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite news|title=And the Name Is…|url=https://eclipse-foundation.blog/2018/02/26/and-the-name-is/|work=Life at Eclipse|date=2018-02-26|access-date=2018-11-25|language=en|archive-date=2018-11-26|archive-url=https://web.archive.org/web/20181126010008/https://eclipse-foundation.blog/2018/02/26/and-the-name-is/}}&amp;lt;/ref&amp;gt;. Модули Java EE удалены из Java SE с 11-й версии&amp;lt;ref&amp;gt;{{Cite web|url=http://openjdk.java.net/jeps/320|title=JEP 320: Remove the Java EE and CORBA Modules|publisher=openjdk.java.net|access-date=2018-11-25|archive-date=2018-11-24|archive-url=https://web.archive.org/web/20181124235611/http://openjdk.java.net/jeps/320|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* [[Java ME]] — Java Micro Edition, создана для использования в устройствах, ограниченных по вычислительной мощности, например, в [[мобильный телефон|мобильных телефонах]], [[Карманный персональный компьютер|КПК]], [[Встраиваемая система|встроенных системах]];&lt;br /&gt;
* [[Java Card]] — технология предоставляет безопасную среду для приложений, работающих на [[смарт-карта]]х и других устройствах с очень ограниченным объёмом памяти и возможностями обработки.&lt;br /&gt;
&lt;br /&gt;
== Java и Microsoft ==&lt;br /&gt;
Компанией [[Microsoft]] была разработана собственная реализация [[JVM]] под названием {{Не переведено 3|Microsoft Java Virtual Machine|4=Microsoft Java Virtual Machine}} (MSJVM)&amp;lt;ref name=&amp;quot;msjvm&amp;quot; /&amp;gt;, включавшаяся в состав различных [[Операционная система|операционных систем]], начиная с [[Windows 98]] (также входила в [[Internet Explorer]] от версии 3 и выше, что позволяло использовать MSJVM в ОС [[Windows 95]] и [[Windows NT 4.0|Windows NT 4]] после установки IE3+ на данные ОС).&lt;br /&gt;
&lt;br /&gt;
MSJVM имела существенные отличия от Sun Java, во многом ломающие основополагающую концепцию переносимости программ между разными платформами:&lt;br /&gt;
* отсутствие поддержки [[Интерфейс программирования приложений|программного интерфейса]] [[Remote Procedure Call|вызова удалённых методов]] ([[RMI]]);&lt;br /&gt;
* отсутствие поддержки технологии [[JNI]];&lt;br /&gt;
* наличие нестандартных расширений, таких, как средства интеграции Java и [[DCOM]], работающих только на платформе Windows.&lt;br /&gt;
&lt;br /&gt;
Тесная интеграция Java с DCOM и [[Windows API|Win32]] поставила под вопрос [[Кроссплатформенность|кроссплатформенную]] парадигму языка. Впоследствии это явилось поводом для судебных исков со стороны [[Sun Microsystems]] к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года&amp;lt;ref name=msjvm&amp;gt;{{cite web&lt;br /&gt;
 |date        = 2003-09-12&lt;br /&gt;
 |url         = http://www.microsoft.com/About/Legal/EN/US/Interoperability/Java/Default.aspx&lt;br /&gt;
 |title       = Microsoft Java Virtual Machine Support&lt;br /&gt;
 |publisher   = Microsoft&lt;br /&gt;
 |access-date  = 2010-10-09&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Официальное заявление Microsoft о программе поддержки MSJVM&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170oubDn?url=http://www.microsoft.com/About/Legal/EN/US/Interoperability/Java/Default.aspx&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В 2005 году компанией Microsoft для платформы [[.NET Framework|.NET]] был представлен Java-подобный язык [[Visual J Sharp|J#]], не соответствующий официальной спецификации языка Java и исключённый впоследствии из стандартного инструментария разработчика [[Microsoft Visual Studio]], начиная с Visual Studio 2008&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |date        = 2007-11&lt;br /&gt;
 |url         = http://msdn.microsoft.com/ru-ru/library/7xsxf8e2(VS.90).aspx&lt;br /&gt;
 |title       = Visual J#&lt;br /&gt;
 |publisher   = Microsoft&lt;br /&gt;
 |access-date  = 2010-10-10&lt;br /&gt;
 |lang        = ru&lt;br /&gt;
 |description = Официальная информация Microsoft об исключении J# из комплекта Visual Studio 2008&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170pJXt3?url=http://msdn.microsoft.com/ru-ru/library/7xsxf8e2(VS.90).aspx&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Java и Android ==&lt;br /&gt;
{{Main|Android}}&lt;br /&gt;
&lt;br /&gt;
Язык Java активно используется для создания мобильных приложений под операционную систему Android. При этом программы компилируются в нестандартный байт-код для использования их виртуальной машиной [[Dalvik virtual machine|Dalvik]] (начиная с [[Android Lollipop|Android 5.0 Lollipop]] виртуальная машина заменена на [[Android Runtime|ART]]). Для такой компиляции используется дополнительный инструмент, а именно [[Android SDK]] ([[SDK|Software Development Kit]]), разработанный компанией [[Google (компания)|Google]].&lt;br /&gt;
&lt;br /&gt;
Разработку приложений можно вести в среде [[Android Studio]], [[NetBeans]], в среде [[Eclipse (среда разработки)|Eclipse]].&lt;br /&gt;
&lt;br /&gt;
== Применения платформы Java ==&lt;br /&gt;
Следующие успешные проекты реализованы с привлечением Java ([[J2EE]]) технологий: [[RuneScape]], [[Amazon]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author       = Todd Hoff.&lt;br /&gt;
 |date         = 2007-09-18&lt;br /&gt;
 |url          = http://highscalability.com/amazon-architecture&lt;br /&gt;
 |title        = Amazon Architecture&lt;br /&gt;
 |access-date   = 2009-06-06&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |description  = Обсуждение архитектуры Amazon с использованием Java-технологий&lt;br /&gt;
 |archive-date = 2009-02-28&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20090228222248/http://highscalability.com/amazon-architecture&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://aws.amazon.com/ec2/&lt;br /&gt;
 |title       = Amazon Elastic Compute Cloud (Amazon EC2)&lt;br /&gt;
 |publisher   = Amazon Web Services LLC&lt;br /&gt;
 |access-date  = 2009-06-06&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Описание технологии и возможностей Amazon EC2 как веб-сервиса&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170rMoFx?url=http://aws.amazon.com/ec2/&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;, [[eBay]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author      = Todd Hoff.&lt;br /&gt;
 |date        = 2008-05-27&lt;br /&gt;
 |url         = http://highscalability.com/ebay-architecture&lt;br /&gt;
 |title       = eBay Architecture&lt;br /&gt;
 |access-date  = 2009-09-06&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Обсуждение архитектуры eBay на платформе Java&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170rzVA7?url=http://highscalability.com/ebay-architecture&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author      = Randy Shoup, Dan Pritchett.&lt;br /&gt;
 |date        = 2006-11-29&lt;br /&gt;
 |url         = http://www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf&lt;br /&gt;
 |title       = The eBay Architecture&lt;br /&gt;
 |work        = SD Forum 2006&lt;br /&gt;
 |publisher   = ???&lt;br /&gt;
 |access-date  = 2009-06-06&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Презентация по истории развития архитектуры eBay&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170saktV?url=http://www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;, [[LinkedIn]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author      = Brian Guan.&lt;br /&gt;
 |date        = 2008-06-11&lt;br /&gt;
 |url         = http://blog.linkedin.com/2008/06/11/grails-at-linkedin/&lt;br /&gt;
 |title       = The LinkedIn Blog. Blog Archive. Grails at LinkedIn&lt;br /&gt;
 |publisher   = LinkedIn.com&lt;br /&gt;
 |access-date  = 2009-06-05&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = История создания системы LinkedIn на основе Java-технологии Grails&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170ueU7e?url=http://blog.linkedin.com/2008/06/11/grails-at-linkedin/&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;, [[Yahoo!]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://developer.yahoo.com/hadoop/&lt;br /&gt;
 |title       = Hadoop and Distributed Computing at Yahoo!&lt;br /&gt;
 |publisher   = Yahoo!&lt;br /&gt;
 |access-date  = 2009-06-21&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Стартовая страница Java-технологии распределённого обслуживания Hadoop на портале разработчиков Yahoo!&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170vguJb?url=http://developer.yahoo.com/hadoop/&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Следующие компании в основном фокусируются на Java- ([[J2EE]]-) технологиях: [[SAP]], [[IBM]], [[Oracle]]. В частности, [[Система управления базами данных|СУБД]] [[Oracle Database]] включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, [[хранимая процедура|хранимые процедуры]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://www.oracle.com/technology/tech/java/jsp/index.html&lt;br /&gt;
 |title       = OracleJVM and Java Stored Procedures&lt;br /&gt;
 |publisher   = Oracle Inc.&lt;br /&gt;
 |access-date  = 2009-06-05&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Раздел портала Oracle, посвящённый технологиям Java в составе сервера СУБД Oracle&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170wCzk5?url=http://www.oracle.com/technetwork/topics/index.html&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также существует Java библиотека классов для сериализации объектов в XML (или JSON) формат — [[XStream]].&lt;br /&gt;
&lt;br /&gt;
=== Производительность ===&lt;br /&gt;
Программы, написанные на Java, имеют репутацию более медленных и занимающих больше оперативной памяти, чем написанные на языке C&amp;lt;ref name=&amp;quot;slow_java&amp;quot;/&amp;gt;. Тем не менее, скорость выполнения программ, написанных на языке Java, была существенно улучшена с выпуском в 1997—1998 годах JIT-компилятора в версии 1.1 в дополнение к другим особенностям языка для поддержки лучшего анализа кода (такие, как внутренние классы, класс &amp;lt;code&amp;gt;StringBuffer&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;док.&amp;quot;&amp;gt;{{Javadoc:SE|java.base/java/lang|StringBuffer}}&amp;lt;/ref&amp;gt;, упрощённые логические вычисления и так далее). Кроме того, была произведена оптимизация виртуальной машины Java — с 2000 года для этого используется виртуальная машина [[HotSpot]]. По состоянию на февраль 2012 года код Java 7 приблизительно в 1,8 раза медленнее кода, написанного на языке Си&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://shootout.alioth.debian.org/u32q/which-programming-languages-are-fastest.php?gcc=on&amp;amp;javasteady=on&amp;amp;java=on&amp;amp;csharp=on&amp;amp;javaxint=on&amp;amp;calc=chart&lt;br /&gt;
 |title       = Ubuntu: Intel® Q6600® quad-core Computer Language Benchmarks&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/68bfPITT0?url=http://shootout.alioth.debian.org/u32q/which-programming-languages-are-fastest.php?gcc=on&lt;br /&gt;
 |archive-date = 2012-06-22&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Некоторые платформы предлагают аппаратную поддержку выполнения для Java&amp;lt;ref&amp;gt;{{Статья|автор=Wolfgang Puffitsch, Martin Schoeberl|заглавие=picoJava-II in an FPGA|ссылка=http://orbit.dtu.dk/files/4176066/pjfpga.pdf|язык=en|издание=DTU Library|тип=|год=2007|месяц=|число=|том=|номер=|страницы=|issn=|access-date=2018-12-02|archive-date=2018-12-02|archive-url=https://web.archive.org/web/20181202202734/http://orbit.dtu.dk/files/4176066/pjfpga.pdf|url-status=live}}&amp;lt;/ref&amp;gt;. К примеру, микроконтроллеры, выполняющие код Java на аппаратном обеспечении вместо программной JVM, а также основанные на ARM процессоры, которые поддерживают выполнение байт-кода Java через опцию Jazelle.&lt;br /&gt;
&lt;br /&gt;
== Основные возможности ==&lt;br /&gt;
* [[Сборка мусора (программирование)|Автоматическое управление памятью]];&lt;br /&gt;
* Расширенные возможности обработки [[Обработка исключений|исключительных ситуаций]];&lt;br /&gt;
* Богатый набор средств фильтрации ввода-вывода;&lt;br /&gt;
* Набор стандартных [[Коллекция (программирование)|коллекций]]: [[Индексный массив|массив]], [[Список (информатика)|список]], [[стек]] и т.п;&lt;br /&gt;
* Наличие простых средств создания сетевых приложений (в том числе — с использованием [[Сетевой протокол|протокола]] [[RMI]]);&lt;br /&gt;
* Наличие классов, позволяющих выполнять [[HTTP]]-запросы и обрабатывать ответы;&lt;br /&gt;
* Встроенные в язык средства создания многопоточных приложений, которые потом были портированы на многие языки, например, [[Python]];&lt;br /&gt;
* Унифицированный доступ к [[База данных|базам данных]]:&lt;br /&gt;
** на уровне отдельных [[SQL]]-запросов — на основе [[JDBC]], [[SQLJ]];&lt;br /&gt;
** на уровне концепции объектов, обладающих способностью к хранению в базе данных — на основе {{нп1|Java Data Objects||en|Java Data Objects}} и [[Java Persistence API]];&lt;br /&gt;
* Поддержка [[Обобщённое программирование|обобщений]] (с версии 1.5);&lt;br /&gt;
* Поддержка [[Лямбда-исчисление|лямбд]], [[Замыкание (программирование)|замыканий]], возможностей [[Функциональное программирование|функционального программирования]] (с Java 8).&lt;br /&gt;
&lt;br /&gt;
== Основные идеи ==&lt;br /&gt;
&lt;br /&gt;
=== Примитивные типы ===&lt;br /&gt;
В языке Java только 8 примитивных (скалярных, простых) [[Тип данных|типов]]: &amp;lt;code&amp;gt;[[Логический тип|boolean]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[Байт|byte]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[символьный тип|char]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[short]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[целый тип|int]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[Long (тип данных)|long]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[число одинарной точности|float]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[Число двойной точности|double]]&amp;lt;/code&amp;gt;. Существует также вспомогательный девятый примитивный тип — &amp;lt;code&amp;gt;[[void]]&amp;lt;/code&amp;gt;, однако переменные и поля такого типа не могут быть объявлены в коде, а сам тип используется только для описания соответствующего ему класса, для использования при [[Отражение (программирование)|рефлексии]]: например, с помощью класса &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;док.&amp;quot;&amp;gt;{{Javadoc:SE|java.base/java/lang|Void}}&amp;lt;/ref&amp;gt; можно узнать, является ли определённый метод типа &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;Hello.class.getMethod(&amp;quot;main&amp;quot;, String[].class).getReturnType() == Void.TYPE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией, и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал [[Unicode]]-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte, причём в Java, в отличие от других языков, он не является беззнаковым. Типы &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; могут иметь специальные значения &amp;lt;math&amp;gt;+\infty&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;-\infty&amp;lt;/math&amp;gt; и «не число» ([[NaN]]). Для типа double они обозначаются &amp;lt;code&amp;gt;Double.POSITIVE_INFINITY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Double.NEGATIVE_INFINITY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Double.NaN&amp;lt;/code&amp;gt;; для типа &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; — так же, но с приставкой &amp;lt;code&amp;gt;Float&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;Double&amp;lt;/code&amp;gt;. Минимальные и максимальные значения, принимаемые типами &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;, тоже стандартизованы.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Тип&lt;br /&gt;
! Длина (в байтах) || Диапазон или набор значений&lt;br /&gt;
|-&lt;br /&gt;
| boolean || 1 в массивах, 4 в переменных&amp;lt;ref&amp;gt;JVM не имеет поддержки для переменных типа boolean, поэтому они представляются в виде значений типа int. Однако массивы boolean[] поддерживаются. [http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#22909 VM Spec The Structure of the Java Virtual Machine] {{Wayback|url=http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#22909 |date=20111124105915 }}&amp;lt;/ref&amp;gt;|| true, false&lt;br /&gt;
|-&lt;br /&gt;
| byte || 1 || −128..127&lt;br /&gt;
|-&lt;br /&gt;
| char || 2 || 0..2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt;−1, или 0..65535&lt;br /&gt;
|-&lt;br /&gt;
| short || 2 || −2&amp;lt;sup&amp;gt;15&amp;lt;/sup&amp;gt;..2&amp;lt;sup&amp;gt;15&amp;lt;/sup&amp;gt;−1, или −32768..32767&lt;br /&gt;
|-&lt;br /&gt;
| int || 4 || −2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt;..2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt;−1, или −2147483648..2147483647&lt;br /&gt;
|-&lt;br /&gt;
| long || 8 || −2&amp;lt;sup&amp;gt;63&amp;lt;/sup&amp;gt;..2&amp;lt;sup&amp;gt;63&amp;lt;/sup&amp;gt;−1, или примерно −9.2·10&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;..9.2·10&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| float || 4 || -(2-2&amp;lt;sup&amp;gt;−23&amp;lt;/sup&amp;gt;)·2&amp;lt;sup&amp;gt;127&amp;lt;/sup&amp;gt;..(2-2&amp;lt;sup&amp;gt;−23&amp;lt;/sup&amp;gt;)·2&amp;lt;sup&amp;gt;127&amp;lt;/sup&amp;gt;, или примерно −3.4·10&amp;lt;sup&amp;gt;38&amp;lt;/sup&amp;gt;..3.4·10&amp;lt;sup&amp;gt;38&amp;lt;/sup&amp;gt;, а также &amp;lt;math&amp;gt;-\infty&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt;, NaN&lt;br /&gt;
|-&lt;br /&gt;
| double || 8 || -(2-2&amp;lt;sup&amp;gt;−52&amp;lt;/sup&amp;gt;)·2&amp;lt;sup&amp;gt;1023&amp;lt;/sup&amp;gt;..(2-2&amp;lt;sup&amp;gt;−52&amp;lt;/sup&amp;gt;)·2&amp;lt;sup&amp;gt;1023&amp;lt;/sup&amp;gt;, или примерно −1.8·10&amp;lt;sup&amp;gt;308&amp;lt;/sup&amp;gt;..1.8·10&amp;lt;sup&amp;gt;308&amp;lt;/sup&amp;gt;, а также &amp;lt;math&amp;gt;-\infty&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt;, NaN&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java. Тем не менее, одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые [[Регистр процессора|регистры]] или другими способами улучшают точность вычислений. Для того, чтобы сделать Java максимально совместимой между разными системами, в ранних версиях любые способы повышения точности вычислений были запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что ухудшение точности ради платформенной независимости мало кому нужно, тем более если за это приходится платить замедлением работы программ. После многочисленных протестов этот запрет отменили, но добавили ключевое слово &amp;lt;code&amp;gt;strictfp&amp;lt;/code&amp;gt;, запрещающее повышение точности. Начиная с Java 17, запрет на повышение точности снова начал действовать, а ключевое слово &amp;lt;code&amp;gt;strictfp&amp;lt;/code&amp;gt; было объявлено устаревшим&amp;lt;ref&amp;gt;{{cite web |url=https://openjdk.org/jeps/306 |lang=en |title=JEP 306: Restore Always-Strict Floating-Point Semantics |url-status=live |access-date=2022-11-21 |archive-url=https://web.archive.org/web/20221121205320/https://openjdk.org/jeps/306 |archive-date=2022-11-21}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Преобразования при математических операциях ====&lt;br /&gt;
В языке Java действуют следующие правила:&lt;br /&gt;
# Если один [[операнд]] имеет тип &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;, другой тоже преобразуется к типу &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Иначе, если один операнд имеет тип &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, другой тоже преобразуется к типу &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Иначе, если один операнд имеет тип &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;, другой тоже преобразуется к типу &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Иначе оба операнда преобразуются к типу &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данный способ неявного преобразования встроенных типов полностью совпадает с преобразованием типов в [[Си (язык программирования)|Си]]/[[C++]]&amp;lt;ref&amp;gt;{{книга|автор=[[Бьярн Страуструп]].|заглавие=Язык программирования C++|оригинал=The C++ Programming Language|место=М.—СПб.|издательство= Бином, Невский диалект|год=2008||страниц=1104|isbn=5-7989-0226-2; ISBN 5-7940-0064-3; ISBN 0-201-70073-5|тираж=5000}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Объектные переменные, объекты, ссылки и указатели ===&lt;br /&gt;
В языке Java имеются только динамически создаваемые объекты. [[Переменная (программирование)|Переменные]] объектного типа и объекты в Java — совершенно разные сущности. Переменные объектного типа являются [[Ссылка (программирование)|ссылками]], то есть аналогами [[Указатель (тип данных)|указателей]] на динамически создаваемые объекты. Это подчёркивается [[Синтаксис (программирование)|синтаксисом]] описания переменных. Так, код на [[C++]] может выглядеть следующим образом:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;double a[10][20];&lt;br /&gt;
Foo b(30);&amp;lt;/source&amp;gt;&lt;br /&gt;
Но то же самое на Java будет выглядеть совсем по-другому:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
double[][] a = new double[10][20];&lt;br /&gt;
Foo b = new Foo(30);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При присваиваниях, передаче в [[Подпрограмма|подпрограммы]] и сравнениях объектные переменные ведут себя как указатели, то есть присваиваются, копируются и сравниваются [[Адрес памяти|адреса]] объектов. А при доступе с помощью объектной переменной к полям данных или методам объекта не требуется никаких специальных операций [[Указатель (тип данных)#Действия над указателями|разыменовывания]] — этот доступ осуществляется так, как если бы объектная переменная была самим объектом.&lt;br /&gt;
&lt;br /&gt;
Объектными являются переменные любого типа, кроме примитивного. Явных указателей в Java нет. В отличие от указателей C, C++ и других языков программирования, ссылки в Java в высокой степени безопасны благодаря жёстким ограничениям на их использование.&lt;br /&gt;
* Нельзя преобразовывать объект типа &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; или любого другого примитивного типа в указатель или ссылку и наоборот.&lt;br /&gt;
* Над ссылками запрещено выполнять операции &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;−−&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;−&amp;lt;/code&amp;gt; или любые другие арифметические и логические операции (&amp;lt;code&amp;gt;&amp;amp;&amp;amp;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;^^&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Преобразование типов между ссылками жёстко регламентировано. За исключением ссылок на массивы, разрешено преобразовывать ссылки только между наследуемым типом и его наследником, причём преобразование наследуемого типа в наследующий должно быть явно задано, а во время выполнения производится проверка его осмысленности. Преобразования ссылок на массивы разрешены лишь тогда, когда разрешены преобразования их базовых типов, а также нет конфликтов размерности.&lt;br /&gt;
* В Java нет операций взятия адреса (&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;) или взятия объекта по адресу (&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;). [[Амперсанд#Прочие применения|Амперсанд]] (&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;) означает всего лишь «побитовое и» (двойной амперсанд — «логическое и»). Однако для булевых типов одиночный амперсанд означает «логическое и», отличающееся от двойного тем, что цепь проверок не прекращается при получении в выражении значения &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;{{Cite web|url=https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.23|title=Java Language Specification|author=[[Гослинг, Джеймс|Джеймс Гослинг]], Билл Джой, Гай Стил, Гилад Брача, Алекс Бакли, Даниел Смит|website=|subtitle=Chapter 15. Expressions|date=|publisher=docs.oracle.com|lang=en|access-date=2018-12-01|archive-date=2018-12-01|archive-url=https://web.archive.org/web/20181201135332/https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.23|url-status=live}}&amp;lt;/ref&amp;gt;. Например, &amp;lt;code&amp;gt;a == b &amp;amp;&amp;amp; foo() == bar()&amp;lt;/code&amp;gt; не повлечёт вызовов &amp;lt;code&amp;gt;foo()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;bar()&amp;lt;/code&amp;gt; в случае, если &amp;lt;code&amp;gt;a != b&amp;lt;/code&amp;gt;, тогда как использование &amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt; — повлечёт в любом случае.&lt;br /&gt;
&lt;br /&gt;
Благодаря таким специально введённым ограничениям в Java невозможно прямое манипулирование памятью на уровне физических адресов (хотя определено значение ссылки, не указывающей ни на что: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Если нужен указатель на примитивный тип, используются классы-обёртки примитивных типов: &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Byte&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Character&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Short&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Integer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Long&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Float&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Double&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Дублирование ссылок и клонирование ====&lt;br /&gt;
При присваивании не происходит копирования объекта, так как объектные переменные — ссылочные. Так, если написать&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Foo foo, bar;&lt;br /&gt;
. . .&lt;br /&gt;
bar = foo;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
то произойдёт копирование адреса из переменной &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; в переменную &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt;. То есть &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt; будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка изменить поля объекта, на который ссылается переменная &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt;, будет менять объект, с которым связана переменная &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt;, и наоборот. Если же необходимо получить именно ещё одну &#039;&#039;копию&#039;&#039; исходного объекта, пользуются или [[Метод (языки программирования)|методом]] (функцией-членом, в терминологии C++) &amp;lt;code&amp;gt;clone()&amp;lt;/code&amp;gt;, создающим копию объекта, или (реже) копирующим [[Конструктор (объектно-ориентированное программирование)|конструктором]] (конструкторы в Java не могут быть виртуальными, поэтому экземпляр класса-потомка будет неправильно скопирован конструктором класса-предка; метод клонирования вызывает нужный конструктор и тем самым позволяет обойти это ограничение).&lt;br /&gt;
&lt;br /&gt;
Метод &amp;lt;code&amp;gt;clone()&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;док.&amp;quot;&amp;gt;{{Javadoc:SE|name=clone()|java.base/java/lang|Object|clone()}}&amp;lt;/ref&amp;gt; требует, чтобы класс реализовывал [[Интерфейс (объектно-ориентированное программирование)|интерфейс]] &amp;lt;code&amp;gt;Cloneable&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;док.&amp;quot;&amp;gt;{{Javadoc:SE|java/lang|Cloneable}}&amp;lt;/ref&amp;gt;. Если класс реализует интерфейс &amp;lt;code&amp;gt;Cloneable&amp;lt;/code&amp;gt;, по умолчанию &amp;lt;code&amp;gt;clone()&amp;lt;/code&amp;gt; копирует все поля (&#039;&#039;мелкая копия&#039;&#039;). Если требуется не копировать, а клонировать поля (а также их поля и так далее), надо переопределять метод &amp;lt;code&amp;gt;clone()&amp;lt;/code&amp;gt;. Определение и использование метода &amp;lt;code&amp;gt;clone()&amp;lt;/code&amp;gt; часто является нетривиальной задачей&amp;lt;ref&amp;gt;{{Cite web|url=https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html|title=Java API Reference|author=|website=|subtitle=Class Object|date=|publisher=docs.oracle.com|lang=en|access-date=2018-11-26|archive-date=2018-11-26|archive-url=https://web.archive.org/web/20181126222346/https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Инициализация переменных ====&lt;br /&gt;
Все переменные или требуют явного определения, или автоматически заполняются нулями (0, &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;). Таким образом, исчезают [[гейзенбаг]]и, связанные со случайным использованием неинициализированной памяти, характерные для низкоуровневых языков вроде [[Си (язык программирования)|Си]].&lt;br /&gt;
&lt;br /&gt;
==== Сборка мусора ====&lt;br /&gt;
В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована [[Сборка мусора (программирование)|сборка мусора]]. Традиционным приёмом, дающим сборщику мусора «намёк» на необходимость освобождения памяти, является присваивание переменной значения &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, что может оказаться эффективным при необходимости освободить более не требующийся объект, ссылка на который хранится в долгоживущем объекте&amp;lt;ref&amp;gt;{{Книга|автор=Scott Oaks|заглавие=Java Performance: The Definitive Guide: Getting the Most Out of Your Code|ссылка=https://books.google.ru/books?id=aIhUAwAAQBAJ&amp;amp;pg=PA195&amp;amp;lpg=PA195&amp;amp;dq=elementData%5B--size%5D+=+null;+//+Let+gc+do+its+work&amp;amp;source=bl&amp;amp;ots=E6Zs7rX4hE&amp;amp;sig=g8RiFVjoILKL2o7mWRNrUWt_ytw&amp;amp;hl=ru&amp;amp;sa=X&amp;amp;ved=2ahUKEwiBjvCGv_7eAhWUhaYKHfNaA-wQ6AEwCHoECAUQAQ|издательство=&amp;quot;O&#039;Reilly Media, Inc.&amp;quot;|год=2014-04-10|страниц=425|isbn=9781449363543|access-date=2021-08-09|archive-date=2021-07-21|archive-url=https://web.archive.org/web/20210721005409/https://books.google.ru/books?id=aIhUAwAAQBAJ&amp;amp;pg=PA195&amp;amp;lpg=PA195&amp;amp;dq=elementData%5B--size%5D+%3D+null%3B+%2F%2F+Let+gc+do+its+work&amp;amp;source=bl&amp;amp;ots=E6Zs7rX4hE&amp;amp;sig=g8RiFVjoILKL2o7mWRNrUWt_ytw&amp;amp;hl=ru&amp;amp;sa=X&amp;amp;ved=2ahUKEwiBjvCGv_7eAhWUhaYKHfNaA-wQ6AEwCHoECAUQAQ#v=onepage&amp;amp;q=elementData%5B--size%5D%20=%20null;%20//%20Let%20gc%20do%20its%20work&amp;amp;f=false|url-status=live}}&amp;lt;/ref&amp;gt;. Это, однако, не значит, что объект, заменённый значением &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, будет немедленно удалён, но есть гарантия, что этот объект будет удалён в будущем. Данный приём всего лишь устраняет ссылку на объект, то есть отвязывает указатель от объекта в памяти. При этом следует учитывать, что объект не будет удалён сборщиком мусора, пока на него указывает хотя бы одна ссылка из используемых переменных или объектов. Существуют также методы для инициации принудительной сборки мусора, но не гарантируется, что они будут вызваны исполняющей средой, и их не рекомендуется использовать для обычной работы. Помимо периодических сборок мусора стоит отметить так называемую «общую сборку мусора» (STW, {{lang-en|Stop The World}}), которая может привести ко временному «подвисанию» исполняемой программы&amp;lt;ref&amp;gt;{{Cite web|url=https://www.ibm.com/docs/en/sdk-java-technology/8?topic=management-garbage-collection-gc|title=Garbage collection|date=2024-02-12|access-date=2025-02-06}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В Java используется несколько сборщиков мусора (Serial GC, Parallel GC, G1, ZGC), какой из них используется по умолчанию — зависит от версии [[Интегрированная среда разработки|IDE]]. Чтобы выбрать какой-то определённый, нужно запустить [[JRE]] с ключом командной строки «-XX:+Use&amp;lt;имя сборщика&amp;gt;GC -jar &amp;lt;имя-jar-файла.jar&amp;gt;», например, вызов «java -XX:+UseG1GC -jar Application.java» приведёт к сборке мусора его сборщиком G1&amp;lt;ref&amp;gt;{{Cite web|url=https://www.baeldung.com/jvm-garbage-collectors|title=JVM Garbage Collectors|date=2024-05-11|access-date=2025-02-04}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Классы и функции ===&lt;br /&gt;
Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член» ({{lang-en|member function}}), а только &#039;&#039;метод&#039;&#039;. В методы превратились и стандартные функции. Например, в Java нет функции &amp;lt;code&amp;gt;sin()&amp;lt;/code&amp;gt;, а есть метод &amp;lt;code&amp;gt;Math.sin()&amp;lt;/code&amp;gt; класса &amp;lt;code&amp;gt;Math&amp;lt;/code&amp;gt; (содержащего, кроме &amp;lt;code&amp;gt;sin()&amp;lt;/code&amp;gt;, методы &amp;lt;code&amp;gt;cos()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;exp()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sqrt()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;abs()&amp;lt;/code&amp;gt; и многие другие).&lt;br /&gt;
&lt;br /&gt;
Как и в языке [[Си (язык программирования)|C]], любая исполняемая программа на Java должна иметь [[Си (язык программирования)#Точка входа программы|точку входа]], которой является метод main — он должен/может быть единственным в программе и, в отличие от Си, всегда статическим. При этом, начиная с Java 21, в которой были экспериментально введены безымянные классы, допускается определять этот метод, не определяя имени главного класса.&lt;br /&gt;
&lt;br /&gt;
Конструкторы в Java не считаются методами. Деструкторов в Java не существует, а метод &amp;lt;code&amp;gt;finalize()&amp;lt;/code&amp;gt; ни в коем случае нельзя считать аналогом деструктора.&lt;br /&gt;
&lt;br /&gt;
==== Конструкторы ====&lt;br /&gt;
Конструктор — это специальный метод, который обязательно вызывается при создании нового объекта, то есть объект (экземпляр класса) не может быть создан без вызова конструктора класса. Не всегда удобно инициализировать все переменные класса при создании его экземпляра, поэтому переменные экземпляра часто объявляют внутри тела конструктора, а инициализируют как аргументы конструктора при создании экземпляра класса. Иногда проще, чтобы какие-то значения были бы созданы по умолчанию при создании объекта. В таком случае переменные объявляются и инициализируются внутри тела конструктора.&lt;br /&gt;
&lt;br /&gt;
Конструктор инициализирует объект непосредственно во время создания. Имя конструктора совпадает с именем класса, включая регистр, а по синтаксису конструктор похож на метод без возвращаемого значения.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
private int Cat();  // так выглядит метод по имени Cat&lt;br /&gt;
Cat();              // так выглядит конструктор класса Cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;В отличие от метода, конструктор никогда ничего не возвращает.&lt;br /&gt;
&lt;br /&gt;
Конструктор определяет действия, выполняемые при создании объекта класса, и является важной частью класса. Как правило, программисты стараются явно указать конструктор. Если явного конструктора нет, то Java автоматически создаст его (пустым) для использования по умолчанию.&lt;br /&gt;
&lt;br /&gt;
В качестве примера можно рассмотреть некий класс &amp;lt;code&amp;gt;Box&amp;lt;/code&amp;gt;, представляющий собой описание коробки. Конструктор класса просто установит начальные размеры для коробки.&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class Box {&lt;br /&gt;
    int width; // ширина коробки&lt;br /&gt;
    int height; // высота коробки&lt;br /&gt;
    int depth; // глубина коробки&lt;br /&gt;
&lt;br /&gt;
    // Конструктор&lt;br /&gt;
    Box(int a, int b) {&lt;br /&gt;
        width = a;&lt;br /&gt;
        height = b;&lt;br /&gt;
        depth = 10;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // вычисляем объём коробки&lt;br /&gt;
    int getVolume() {&lt;br /&gt;
    	return width * height * depth;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Статические методы и поля ====&lt;br /&gt;
В Java (как и в C++) используются &#039;&#039;статические поля и&#039;&#039; &#039;&#039;статические методы&#039;&#039; ({{lang-en|static method}} — в теории программирования их также называют методами класса), которые задаются при помощи ключевого слова &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;. Статические поля (переменные класса) имеют тот же смысл, что и в C++: каждое такое поле является собственностью класса, поэтому для доступа к статическим полям не требуется создавать экземпляры соответствующего класса.&lt;br /&gt;
&lt;br /&gt;
Например, математические функции, реализованные в классе &amp;lt;code&amp;gt;Math&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;док.&amp;quot;&amp;gt;{{Javadoc:SE|java.base/java/lang|Math}}&amp;lt;/ref&amp;gt;, представляют собой как раз статические методы данного класса. Поэтому их можно вызывать напрямую из класса, не создавая его экземпляра, например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;double x = Math.sin(1);&amp;lt;/source&amp;gt;&lt;br /&gt;
Создание экземпляра статического класса запрещают с помощью приватного конструктора. Например, создание экземпляра класса &amp;lt;code&amp;gt;Math&amp;lt;/code&amp;gt; приведёт к ошибке на этапе компиляции:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;Math m = new Math(); // Error: Math() has private access in java.lang.Math&lt;br /&gt;
double x = m.sin(1); // Метода sin у объекта не существовало бы, т. к. он статичный&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку статические методы существуют независимо от объектов (экземпляров класса), они не имеют доступа к обычным (не статическим) полям и методам данного класса. В частности, при реализации статического метода недопустимо использовать идентификатор &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможность статического импорта позволяет вызывать статические функции и константы без указания класса. Пример без статического импорта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
double x = Math.sin(Math.tan(Math.sqrt(y)) + Math.floor(24.5)) + Math.cos(42 * Math.PI);&amp;lt;/source&amp;gt;&lt;br /&gt;
Тот же пример, но со статическим импортом:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import static java.lang.Math.*;&lt;br /&gt;
...&lt;br /&gt;
double x = sin(tan(sqrt(y)) + floor(24.5)) + cos(42 * PI);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Завершённость (final) ====&lt;br /&gt;
Ключевое слово &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt; (финальный) имеет разные значения при описании поля, метода или класса.&lt;br /&gt;
# Финальное &#039;&#039;&#039;поле&#039;&#039;&#039; класса инициализируется при описании или в конструкторе класса (а статическое поле — в статическом блоке инициализации). Впоследствии его значение не может быть изменено. Если статическое поле класса или переменная проинициализированы константным выражением, они рассматриваются компилятором как [[константа (программирование)|именованная константа]]; в таком случае их значение может быть использовано в [[Switch (оператор)|операторах &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;]] (для констант типов &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;, в том числе — элементов [[Перечисляемый тип#Java|перечислений]]), а также для условной компиляции (для констант типа &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt;) при использовании с [[Условный оператор|оператором &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;]].&lt;br /&gt;
# Значения &#039;&#039;&#039;локальных переменных&#039;&#039;&#039;, а также &#039;&#039;&#039;параметров метода&#039;&#039;&#039;, помеченных ключевым словом &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt;, не могут быть изменены после присвоения. При этом их значения могут использоваться внутри [[Внутренний класс#Анонимные (безымянные) классы|анонимных классов]].&lt;br /&gt;
# &#039;&#039;&#039;Метод&#039;&#039;&#039; класса, отмеченный словом &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt;, не может быть переопределён при наследовании. В случае &#039;&#039;&#039;статического&#039;&#039;&#039; метода с модификатором &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt; метод не может быть скрыт (hide) методом дочернего класса при наследовании.&lt;br /&gt;
# [[Листовой класс|Финальный &#039;&#039;&#039;класс&#039;&#039;&#039;]] не может иметь наследников.&lt;br /&gt;
&lt;br /&gt;
==== Абстрактность ====&lt;br /&gt;
В Java методы, не объявленные явно как &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, являются [[Виртуальный метод|виртуальными]] в терминологии C++: при вызове метода, по-разному определённого в базовом и наследующем классах, всегда производится проверка времени выполнения.&lt;br /&gt;
&lt;br /&gt;
[[Абстрактный метод|Абстрактным методом]] (модификатор &amp;lt;code&amp;gt;abstract&amp;lt;/code&amp;gt;) в Java называется метод, для которого заданы параметры и тип возвращаемого значения, но не задано тело. Абстрактный метод определяется в классах-наследниках. Аналог абстрактного метода в C++ — чисто виртуальная функция (pure virtual function). Для того чтобы в классе можно было описывать абстрактные методы, сам класс тоже должен быть описан как абстрактный. Объекты абстрактного класса создавать нельзя.&lt;br /&gt;
&lt;br /&gt;
==== Интерфейсы ====&lt;br /&gt;
Высшей степенью абстрактности в Java является интерфейс (модификатор &amp;lt;code&amp;gt;interface&amp;lt;/code&amp;gt;). Интерфейс содержит преимущественно абстрактные методы, имеющие всеобщий уровень доступа: описатели &amp;lt;code&amp;gt;abstract&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; для них даже не требуются. Однако с версий Java 8 и 9 были введены возможности использования в интерфейсах&lt;br /&gt;
&lt;br /&gt;
— Java 8: статических (&amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;) методов и методов по умолчанию (&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
— Java 9: методов, имеющих уровень доступа &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Эти методы содержат тело, а значит абстрактными не являются, но в конкретной реализации интерфейса &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;-методы могут быть переопределены.&lt;br /&gt;
&lt;br /&gt;
Интерфейс в Java не считается классом, хотя, по сути, является полностью абстрактным классом.&lt;br /&gt;
&lt;br /&gt;
Класс может наследовать/&#039;&#039;расширять&#039;&#039; (&amp;lt;code&amp;gt;extends&amp;lt;/code&amp;gt;) другой класс или &#039;&#039;реализовывать&#039;&#039; (&amp;lt;code&amp;gt;implements&amp;lt;/code&amp;gt;) интерфейс. Интерфейсы же могут наследовать/расширять другие интерфейсы. В Java класс не может наследовать более одного класса, зато может реализовывать несколько интерфейсов. Множественное наследование интерфейсов не запрещено — один интерфейс может наследоваться от нескольких.&lt;br /&gt;
&lt;br /&gt;
С версии Java 15 (экспериментально, официально — с версии Java 17) добавлена возможность использования запечатанных (&amp;lt;code&amp;gt;sealed&amp;lt;/code&amp;gt;) классов/интерфейсов, при объявлении которых, с помощью ключевого слова &amp;lt;code&amp;gt;permits&amp;lt;/code&amp;gt;, можно указывать, какие классы/интерфейсы могут наследовать данный запечатанный класс/интерфейс.&lt;br /&gt;
&lt;br /&gt;
Интерфейсы можно использовать в качестве типов параметров методов. Нельзя создавать экземпляры интерфейсов.&lt;br /&gt;
&lt;br /&gt;
===== Маркерные интерфейсы =====&lt;br /&gt;
В Java есть интерфейсы, которые не содержат методов для реализации, а специальным образом обрабатываются JVM: &amp;lt;code&amp;gt;Cloneable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Serializable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RandomAccess&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Remote&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Шаблоны в Java (generics) ====&lt;br /&gt;
{{anchor|generics}}&lt;br /&gt;
Начиная с версии Java 5.0 в языке появился механизм [[обобщённое программирование|обобщённого программирования]] — шаблоны, внешне близкие к шаблонам C++. С помощью специального синтаксиса в описании классов и методов можно указать параметры-типы, которые внутри описания могут использоваться в качестве типов полей, параметров и возвращаемых значений методов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Объявление обобщённого класса&lt;br /&gt;
class GenericClass&amp;lt;E&amp;gt; {&lt;br /&gt;
  E getFirst() { ... }&lt;br /&gt;
  void add(E obj) { ... }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Использование обобщённого класса в коде&lt;br /&gt;
GenericClass&amp;lt;String&amp;gt; obj = new GenericClass&amp;lt;&amp;gt;();&lt;br /&gt;
obj.add(&amp;quot;qwerty&amp;quot;);&lt;br /&gt;
String p = obj.getFirst();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Допускается обобщённое объявление классов, интерфейсов и методов. Кроме того, синтаксис поддерживает ограниченные объявления типов-параметров: указание в объявлении конструкции вида &amp;lt;code&amp;gt;&amp;amp;lt;T extends A &amp;amp; B &amp;amp; C...&amp;amp;gt;&amp;lt;/code&amp;gt; требует, чтобы тип-параметр T реализовывал интерфейсы A, B, C и так далее.&lt;br /&gt;
&lt;br /&gt;
В отличие от шаблонов C#, шаблоны Java не поддерживаются средой исполнения — компилятор просто создаёт байт-код, в котором никаких шаблонов уже нет. Реализация шаблонов в Java принципиально отличается от реализации аналогичных механизмов в C++: компилятор не порождает для каждого случая использования шаблона отдельный вариант класса или метода-шаблона, а просто создаёт одну реализацию байт-кода, содержащую необходимые проверки и преобразования типов. Это приводит к ряду ограничений использования шаблонов в программах на Java.&lt;br /&gt;
&lt;br /&gt;
==== Проверка принадлежности к классу ====&lt;br /&gt;
В Java можно явно проверить, к какому классу принадлежит объект. Выражение &amp;lt;code&amp;gt;foo instanceof Foo&amp;lt;/code&amp;gt; равно &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, если объект &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; принадлежит классу &amp;lt;code&amp;gt;Foo&amp;lt;/code&amp;gt; или его наследнику, или реализует интерфейс &amp;lt;code&amp;gt;Foo&amp;lt;/code&amp;gt; (или, в общем виде, наследует класс, который реализует интерфейс, который наследует &amp;lt;code&amp;gt;Foo&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Далее функция &amp;lt;code&amp;gt;getClass()&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;док.&amp;quot;&amp;gt;{{Javadoc:SE|name=getClass()|java.base/java/lang|Object|getClass()}}&amp;lt;/ref&amp;gt;, определённая для всех объектов, выдаёт объект типа &amp;lt;code&amp;gt;Class&amp;lt;?&amp;gt;&amp;lt;/code&amp;gt;. Для каждого класса создаётся не более одного описывающего его объекта типа &amp;lt;code&amp;gt;Class&amp;lt;/code&amp;gt;, поэтому эти объекты можно сравнивать. Так, например, &amp;lt;code&amp;gt;foo.getClass() == bar.getClass()&amp;lt;/code&amp;gt; будет истинно, если объекты &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt; принадлежат к одному классу.&lt;br /&gt;
&lt;br /&gt;
Кроме того, объект типа &amp;lt;code&amp;gt;Class&amp;lt;?&amp;gt;&amp;lt;/code&amp;gt; любого типа можно получить так: &amp;lt;code&amp;gt;Integer.class&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Object.class&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прямое сравнение классов не всегда является оптимальным средством проверки на принадлежность к классу. Зачастую вместо него используют функцию &amp;lt;code&amp;gt;isAssignableFrom()&amp;lt;/code&amp;gt;. Эта функция определена у объекта типа &amp;lt;code&amp;gt;Class&amp;lt;/code&amp;gt; и принимает объект типа &amp;lt;code&amp;gt;Class&amp;lt;?&amp;gt;&amp;lt;/code&amp;gt; в качестве параметра. Таким образом, вызов &amp;lt;code&amp;gt;Foo.class.isAssignableFrom(Bar.class)&amp;lt;/code&amp;gt; вернёт &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; в случае, если &amp;lt;code&amp;gt;Foo&amp;lt;/code&amp;gt; является предком класса &amp;lt;code&amp;gt;Bar&amp;lt;/code&amp;gt;. Так как все объекты являются потомками типа &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;, вызов &amp;lt;code&amp;gt;Object.class.isAssignableFrom()&amp;lt;/code&amp;gt; всегда вернёт &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В паре с упомянутыми функциями объекта типа &amp;lt;code&amp;gt;Class&amp;lt;/code&amp;gt; используются также функции &amp;lt;code&amp;gt;isInstance&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;док.&amp;quot;&amp;gt;{{Javadoc:SE|name=isInstance()|java.base/java/lang|Class|isInstance(java.lang.Object)}}&amp;lt;/ref&amp;gt; (эквивалентно &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;), а также &amp;lt;code&amp;gt;cast()&amp;lt;/code&amp;gt; (преобразует параметр в объект выбранного класса).&lt;br /&gt;
&lt;br /&gt;
=== Обработка ошибок ===&lt;br /&gt;
Обработка ошибок в Java похожа на обработку ошибок в [[C++]] за исключением необходимости в блоке &amp;lt;code&amp;gt;finally&amp;lt;/code&amp;gt;. Данное отличие обусловлено тем, что Java не может придерживаться концепции [[Получение ресурса есть инициализация|RAII]] из-за наличия сборщика мусора, а автоматическое освобождение ресурсов в деструкторе может идти в непредсказуемом порядке через произвольные промежутки времени.&lt;br /&gt;
&lt;br /&gt;
Осуществляется обработка ошибок с помощью операторов &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;finally&amp;lt;/code&amp;gt;. Выбрасываемая ошибка описывается объектом определённого класса, наследующегося от &amp;lt;code&amp;gt;Throwable&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;док.&amp;quot;&amp;gt;{{Javadoc:SE|java.base/java/lang|Throwable}}&amp;lt;/ref&amp;gt; и соответствующего типу ошибки. Внутрь блока &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; помещается код, который может выбросить исключение, а блок &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; отлавливает заданные программистом типы ошибок. При этом можно указывать более одного блока &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; для обработки различных классов ошибок, или multi-catch для обработки нескольких ошибок. Блок &amp;lt;code&amp;gt;finally&amp;lt;/code&amp;gt; является необязательным, но при наличии выполняется независимо от возникновения ошибки и предназначен для освобождения выделенных в ходе работы блока &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; ресурсов.&lt;br /&gt;
&lt;br /&gt;
Начиная с Java 7 поддерживается интерфейс &amp;lt;code&amp;gt;AutoCloseable&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;док.&amp;quot;&amp;gt;{{Javadoc:SE|java.base/java/lang|AutoCloseable}}&amp;lt;/ref&amp;gt;, который позволяет реализовывать классы, автоматически освобождающие ресурсы. Объекты подобных классов требуется создавать в круглых скобках перед блоком &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;. Простым примером автоматического освобождения ресурсом может служить чтение содержимого файла:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    public static void main(String[] args) throws IOException {&lt;br /&gt;
        if (args.length &amp;lt; 2) {&lt;br /&gt;
            System.err.println(&amp;quot;Не указано имя файла.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        String filename = args[1];&lt;br /&gt;
        // Открытый файл будет автоматически закрыт по ошибке&lt;br /&gt;
        try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
            String line;&lt;br /&gt;
            for (int n = 1; (line = reader.readLine()) != null; ++n) {&lt;br /&gt;
                System.out.println(n + &amp;quot;: &amp;quot; + line);&lt;br /&gt;
            }&lt;br /&gt;
        } catch (FileNotFoundException e) {&lt;br /&gt;
            System.err.println(&amp;quot;Указанный файл не найден.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // finally {&lt;br /&gt;
        //     reader.close(); // автоматическое закрытие ресурса&lt;br /&gt;
        // }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Java придерживается концепции обязательного указания классов ошибок, которые может выбросить метод. Делается это с помощью ключевого слова &amp;lt;code&amp;gt;throws&amp;lt;/code&amp;gt; после описания метода. Если в методе не указать класс исключения (или его предка), которое может быть выброшено из метода, то это вызовет ошибку компиляции. Концепция должна была позволить делать код самодокументируемым, обозначая, какие исключения может выбросить тот или иной метод, но на практике редко себя оправдывает, поскольку в силу разных обстоятельств программист может указать в качестве выбрасываемого исключения класс &amp;lt;code&amp;gt;Exception&amp;lt;/code&amp;gt; либо заключить проблемные части метода в блок &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;...&amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; для игнорирования отдельных ошибок, либо — в блок &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;...&amp;lt;code&amp;gt;finally&amp;lt;/code&amp;gt;, скрывая все возможные ошибки. Недостатком концепции также является и то, что программист сам должен определять и прописывать исключения, которые может выбрасывать метод&amp;lt;ref&amp;gt;{{Cite web|url=https://www.artima.com/intv/handcuffs.html|title=The Trouble with Checked Exceptions|publisher=www.artima.com|access-date=2018-12-21|archive-date=2019-01-08|archive-url=https://web.archive.org/web/20190108114501/https://www.artima.com/intv/handcuffs.html|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Пространство имён ===&lt;br /&gt;
{{main|Пространство имён (программирование)}}&lt;br /&gt;
Идея пространств имён воплощена в [[Package (Java)|Java-пакетах]].&lt;br /&gt;
&lt;br /&gt;
Название Java-пакета создаётся [[латинский алфавит|латиницей]] (используется нижний и верхний регистр) с [[цифры|цифрами]] (они не должны быть первыми в строке) и знаком подчёркивания (он не должен быть первым и последним в строке), не являющейся инструкциями языка (например, &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;), разделённой точками.&lt;br /&gt;
&lt;br /&gt;
Правильные примеры названий:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;project.types.net.media&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;a0.a_b.canrepeat.canrepeat.UPPERCASE.RaNdOmCaSe&amp;lt;/code&amp;gt; (хотя нежелательно, из-за нечитабельности)&lt;br /&gt;
&lt;br /&gt;
Неправильные примеры названий:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;doubledots..something&amp;lt;/code&amp;gt; (две точки подряд)&lt;br /&gt;
* &amp;lt;code&amp;gt;нестандартный.язык&amp;lt;/code&amp;gt; (не латиница)&lt;br /&gt;
* &amp;lt;code&amp;gt;0first.characret.is.number&amp;lt;/code&amp;gt; (число в начале)&lt;br /&gt;
* &amp;lt;code&amp;gt;contains.white space&amp;lt;/code&amp;gt; (пробел вместо точки)&lt;br /&gt;
* &amp;lt;code&amp;gt;true.asd&amp;lt;/code&amp;gt; (содержит &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, см. выше)&lt;br /&gt;
&lt;br /&gt;
Пакеты содержат классы, интерфейсы, перечисления, аннотации (и т. д.), имена которых тоже создаются латиницей (используется нижний и верхний регистр) с цифрами (они не должны стоять первыми в строке). Публичный класс, интерфейс (и т. д.) в одном файле может быть только один. Имя публичного класса, интерфейса (и т. д.) в файле должно совпадать с названием файла. Каждый класс имеет своё пространство имён для функций, переменных и подклассов, подинтерфейсов (и т. д.), причём получить подкласс класса можно с помощью &amp;lt;code&amp;gt;OuterClass.InnerClass&amp;lt;/code&amp;gt;, а можно — с помощью &amp;lt;code&amp;gt;OuterClass$InnerClass&amp;lt;/code&amp;gt;, поэтому использование символа доллара в названии класса не рекомендуется.&lt;br /&gt;
&lt;br /&gt;
== Примеры программ ==&lt;br /&gt;
Код программы «[[Hello, world!]]».&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class HelloWorld {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        System.out.println(&amp;quot;Hello, world!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[обобщённое программирование|Обобщения]]:&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример использования обобщений&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
&lt;br /&gt;
public class Sample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        // Создание объекта по шаблону.&lt;br /&gt;
        List&amp;lt;String&amp;gt; strings = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
        strings.add(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
        strings.add(&amp;quot;world&amp;quot;);&lt;br /&gt;
        strings.add(&amp;quot;!&amp;quot;);&lt;br /&gt;
        for (var string : strings) {&lt;br /&gt;
            System.out.print(string + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Отражение (программирование)|Рефлексия]]:&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример использования рефлексии&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.lang.reflect.Field;&lt;br /&gt;
import java.lang.reflect.Method;&lt;br /&gt;
&lt;br /&gt;
class TestClass {&lt;br /&gt;
    private int value;&lt;br /&gt;
    public int getValue() { return value; }&lt;br /&gt;
    public void setValue(int valueIn) { this.value = valueIn; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        var testClass = new TestClass();&lt;br /&gt;
&lt;br /&gt;
        for (var field: testClass.getClass().getDeclaredFields()) {&lt;br /&gt;
            System.out.printf(&amp;quot;name:%s, type:%s \n&amp;quot;, field.getName(), field.getType().getCanonicalName());&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        for (var method : testClass.getClass().getDeclaredMethods()) {&lt;br /&gt;
            System.out.printf(&amp;quot;name:%s, return type:%s  \n&amp;quot;, method.getName(), method.getReturnType().getCanonicalName());&lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Аннотация (Java)|Аннотации]]:&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Пример использования аннотаций&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.lang.annotation.ElementType;&lt;br /&gt;
import java.lang.annotation.Retention;&lt;br /&gt;
import java.lang.annotation.RetentionPolicy;&lt;br /&gt;
import java.lang.annotation.Target;&lt;br /&gt;
&lt;br /&gt;
@Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;
@Target(ElementType.TYPE)&lt;br /&gt;
public @interface MyAnnotation {&lt;br /&gt;
&lt;br /&gt;
    public boolean value() default false;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@MyAnnotation(value=true)&lt;br /&gt;
public class TestClass {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        var testClass = new TestClass();&lt;br /&gt;
&lt;br /&gt;
        var myAnnotation = testClass.getClass().getAnnotation(MyAnnotation.class);&lt;br /&gt;
        if (myAnnotation != null) {&lt;br /&gt;
            System.out.printf(&amp;quot;value:%s \n&amp;quot;, myAnnotation.value());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Средства разработки ПО ==&lt;br /&gt;
* [[JDK]] — помимо набора библиотек для платформ [[Java SE]] и [[Java EE]], содержит компилятор командной строки javac и набор утилит, так же работающих в режиме командной строки.&lt;br /&gt;
* [[NetBeans IDE]] — свободная интегрированная среда разработки для всех платформ Java — [[Java ME]], [[Java SE]] и [[Java EE]]. Пропагандируется [[Oracle]], владельцем технологии Java, как базовое средство для разработки ПО на языке Java и других языках ([[Си (язык программирования)|C]], [[C++]], [[PHP]], [[Fortran]] и др.).&lt;br /&gt;
* [[Eclipse (среда разработки)|Eclipse IDE]] — свободная интегрированная среда разработки для [[Java SE]], [[Java EE]] и [[Java ME]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://www.eclipse.org/pulsar/&lt;br /&gt;
 |title       = Pulsar - Eclipse Mobile Tools Platform&lt;br /&gt;
 |publisher   = Eclipse&lt;br /&gt;
 |access-date  = 2011-03-23&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Проект eclipse для мобильных разработчиков&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/6170xVuSz?url=http://www.eclipse.org/pulsar/&lt;br /&gt;
 |archive-date = 2011-08-21&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;. Пропагандируется [[IBM]], одним из важнейших разработчиков корпоративного ПО, как базовое средство для разработки ПО на языке Java и других языках ([[Си (язык программирования)|C]], [[C++]], [[Ruby]], [[Fortran]] и др.).&lt;br /&gt;
* [[IntelliJ IDEA]] — среда разработки для платформ [[Java SE]], [[Java EE]] и [[Java ME]]. Разработчик — компания [[JetBrains]]. Распространяется в двух версиях: свободной бесплатной (Community Edition) и коммерческой проприетарной (Ultimate Edition).&lt;br /&gt;
* [[JDeveloper]] — среда разработки для платформ [[Java SE]], [[Java EE]] и [[Java ME]]. Разработчик — компания [[Oracle]].&lt;br /&gt;
* [[BlueJ]] — среда разработки программного обеспечения на языке Java, созданная в основном для использования в обучении, но также подходящая для разработки небольших программ.&lt;br /&gt;
* [[Geany]] — [[свободное программное обеспечение|свободная]] [[среда разработки программного обеспечения]], написанная с использованием [[Библиотека времени исполнения|библиотеки]] [[GTK2]].&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
{{навигация|&lt;br /&gt;
Викисловарь = Java}}&lt;br /&gt;
* [[Сравнение C Sharp и Java|Сравнение C# и Java]]&lt;br /&gt;
* [[Список Java API]]&lt;br /&gt;
* [[Java User Group]]s&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
{{примечания|group=&amp;quot;прим.&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=== Документация ===&lt;br /&gt;
{{примечания|group=&amp;quot;док.&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=== Источники ===&lt;br /&gt;
{{примечания|3}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Java. Полное руководство, 10-е издание&lt;br /&gt;
|оригинал = Java. The Complete Reference, 10th Edition&lt;br /&gt;
|автор = Герберт Шилдт&lt;br /&gt;
|страниц = 1488&lt;br /&gt;
|isbn = 978-5-6040043-6-4&lt;br /&gt;
|год = 2018&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Java SE 9. Базовый курс&lt;br /&gt;
|оригинал = Core Java SE 9 for the Impatient&lt;br /&gt;
|автор = Кей С. Хорстманн&lt;br /&gt;
|страниц = 576&lt;br /&gt;
|isbn = 978-5-6040043-0-2, 978-0-13-469472-6&lt;br /&gt;
|год = 2018&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Java SE 8. Вводный курс&lt;br /&gt;
|оригинал = Java SE 8 for the Really Impatient&lt;br /&gt;
|автор = Кей С. Хорстманн&lt;br /&gt;
|страниц = 208&lt;br /&gt;
|isbn = 978-5-8459-1900-7&lt;br /&gt;
|год = 2014&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Руководство для программиста на Java: 75 рекомендаций по написанию надёжных и защищённых программ&lt;br /&gt;
|оригинал = Java Coding Guidelines: 75 Recommendations for Reliable and Secure Programs&lt;br /&gt;
|автор = Фрэд Лонг, Дхрув Мохиндра, Роберт С. Сикорд, Дин Ф. Сазерленд, Дэвид Свобода&lt;br /&gt;
|страниц = 256&lt;br /&gt;
|isbn = 978-5-8459-1897-0&lt;br /&gt;
|год = 2014&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Java. Библиотека профессионала, том 1. Основы. 10-е издание&lt;br /&gt;
|оригинал = Core Java. Volume I - Fundamentals (Tenth Edition)&lt;br /&gt;
|автор = Кей С. Хорстманн&lt;br /&gt;
|страниц = 864&lt;br /&gt;
|isbn = 978-5-8459-2084-3&lt;br /&gt;
|год = 2017&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Java. Библиотека профессионала, том 2. Расширенные средства программирования. 10-е издание&lt;br /&gt;
|оригинал = Core Java. Volume II - Advanced Feature (Tenth Edition)&lt;br /&gt;
|автор = Кей С. Хорстманн&lt;br /&gt;
|страниц = 976&lt;br /&gt;
|isbn = 978-5-9909445-0-3&lt;br /&gt;
|год = 2017&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Java 9 для чайников&lt;br /&gt;
|оригинал = Java For Dummies, 7th edition&lt;br /&gt;
|автор = Барри Берд&lt;br /&gt;
|страниц = 624&lt;br /&gt;
|isbn = 978-5-9500296-1-5, 978-1-119-23555-2&lt;br /&gt;
|год = 2018&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Java 9. Полный обзор нововведений&lt;br /&gt;
|оригинал = Java 9 Revealed&lt;br /&gt;
|автор = Кишори Шаран&lt;br /&gt;
|страниц = 544&lt;br /&gt;
|isbn = 978-5-97060-575-2&lt;br /&gt;
|год = 2018&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[ДМК Пресс (издательство)|«ДМК Пресс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Язык программирования Java SE 8. Подробное описание, 5-е издание&lt;br /&gt;
|оригинал = The Java Language Specification, Java SE 8 Edition (5th Edition) (Java Series)&lt;br /&gt;
|автор = Джеймс Гослинг, Билл Джой, Гай Стил, Гилад Брача, Алекс Бакли&lt;br /&gt;
|страниц = 672&lt;br /&gt;
|isbn = 978-5-8459-1875-8&lt;br /&gt;
|год = 2015&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Джошуа Блох.&lt;br /&gt;
|заглавие = Java. Эффективное программирование&lt;br /&gt;
|оригинал = Effective Java&lt;br /&gt;
|издание=3-е&lt;br /&gt;
|место = М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|Диалектика]]&lt;br /&gt;
|год = 2019&lt;br /&gt;
|страниц = 464&lt;br /&gt;
|isbn = 978-5-6041394-4-8&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Бенджамин Дж. Эванс, Джеймс Гоф, Крис Ньюленд&lt;br /&gt;
|заглавие = Java: оптимизация программ. Практические методы повышения производительности приложений в JVM&lt;br /&gt;
|оригинал =&lt;br /&gt;
|издание=&lt;br /&gt;
|место = М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|Диалектика]]&lt;br /&gt;
|год = 2019&lt;br /&gt;
|страниц = 448&lt;br /&gt;
|isbn = 978-5-907114-84-5&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Монахов Вадим.&lt;br /&gt;
|заглавие = Язык программирования Java и среда NetBeans&lt;br /&gt;
|ссылка =&lt;br /&gt;
|издание = 3-е изд&lt;br /&gt;
|место = СПб.&lt;br /&gt;
|издательство = [[БХВ-Петербург]]&lt;br /&gt;
|год = 2011&lt;br /&gt;
|страниц = 704&lt;br /&gt;
|isbn = 978-5-9775-0671-7&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Брюс Эккель.&lt;br /&gt;
|заглавие = Философия Java&lt;br /&gt;
|оригинал = Thinking in Java&lt;br /&gt;
|издание = 4-е изд&lt;br /&gt;
|место = СПб.&lt;br /&gt;
|издательство = [[Питер (издательство)|Питер]]&lt;br /&gt;
|год = 2018&lt;br /&gt;
|страниц = 1168&lt;br /&gt;
|isbn = 978-5-496-01127-3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [https://www.java.com/ru/ Официальный сайт Java]&lt;br /&gt;
* [https://docs.oracle.com/en/java/javase/ Официальная документация Java]&lt;br /&gt;
* [https://docs.oracle.com/javase/specs/index.html Спецификация языка и JVM]&lt;br /&gt;
&lt;br /&gt;
{{Внешние ссылки}}&lt;br /&gt;
{{Java}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Java| ]]&lt;br /&gt;
[[Категория:Языки веб-программирования]]&lt;br /&gt;
[[Категория:Языки программирования с автоматическим управлением памятью]]&lt;/div&gt;</summary>
		<author><name>31.41.59.210</name></author>
	</entry>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=JavaScript&amp;diff=8051</id>
		<title>JavaScript</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=JavaScript&amp;diff=8051"/>
		<updated>2026-03-22T08:05:32Z</updated>

		<summary type="html">&lt;p&gt;31.41.59.210: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{не путать|Java}}&lt;br /&gt;
{{не путать|JScript}}&lt;br /&gt;
{{Карточка языка программирования&lt;br /&gt;
| название = JavaScript&lt;br /&gt;
| класс = [[Мультипарадигменный язык программирования|мультипарадигменный]]:&lt;br /&gt;
[[объектно-ориентированное программирование|объектно-ориентированное]] ([[Прототипное программирование|прототипное]]),&lt;br /&gt;
[[обобщённое программирование|обобщённое]],&lt;br /&gt;
[[Функциональное программирование|функциональное]],&lt;br /&gt;
[[Императивное программирование|императивное]],&lt;br /&gt;
[[Аспектно-ориентированное программирование|аспектно-ориентированное]],&lt;br /&gt;
[[Событийно-ориентированное программирование|событийно-ориентированное]] программирование&lt;br /&gt;
| логотип = Unofficial JavaScript logo 2.svg&lt;br /&gt;
| тип = интерпретация, JIT в машинные коды&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор         = Nicholas C. Zakas.&lt;br /&gt;
 |часть         = Next-Generation JavaScript Engines&lt;br /&gt;
 |заглавие      = High Performance JavaScript&lt;br /&gt;
 |ссылка       = https://archive.org/details/highperformancej0000zaka&lt;br /&gt;
 |ответственный = Editor: Mary E. Treseler&lt;br /&gt;
 |издание       = 1st ed&lt;br /&gt;
 |место         = 1005 Gravenstein Highway North, Sebastopol, CA 95472&lt;br /&gt;
 |издательство  = [[O’Reilly Media]]&lt;br /&gt;
 |год           = 2010&lt;br /&gt;
 |pages         = xiii&lt;br /&gt;
 |isbn          = 978-0-596-80279-0&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
| дата выпуска = [[4 декабря]] [[1995]]&lt;br /&gt;
| автор = [[Эйх, Брендан|Брендан Эйх]]&lt;br /&gt;
| последняя версия = ECMAScript 2024&amp;lt;ref name=&amp;quot;ECMA 262&amp;quot;&amp;gt;{{Cite news|title=ECMA-262|url=https://www.ecma-international.org/publications-and-standards/standards/ecma-262/|access-date=2024-08-30|archive-date=2024-08-28|archive-url=https://web.archive.org/web/20240828033536/https://ecma-international.org/publications-and-standards/standards/ecma-262/|url-status=live |lang=en}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
| дата выпуска последней версии = {{start date and age|2024|06}}&lt;br /&gt;
| система типов = [[Динамическая типизация|динамическая]], [[Сильная и слабая типизация|слабая]], [[Утиная типизация|утиная]]&lt;br /&gt;
| реализации = [[SpiderMonkey]], [[Rhino]], {{iw|KJS (JavaScript)||en|KDE&#039;s JavaScript engine}}, [[WebKit#JavaScriptCore|JavaScriptCore]], [[V8 (движок JavaScript)|V8]]&lt;br /&gt;
| испытал влияние = [[Lua]], [[Self]]&amp;lt;ref name=&amp;quot;speaking_js_influences&amp;quot;&amp;gt;{{книга&lt;br /&gt;
 |автор        = Dr. Axel Rauschmayer&lt;br /&gt;
 |часть        = The Nature of JavaScript&lt;br /&gt;
 |ссылка часть = http://speakingjs.com/es5/ch03.html#_influences&lt;br /&gt;
 |заглавие     = Speaking JavaScript&lt;br /&gt;
 |ссылка       = http://speakingjs.com/es5/&lt;br /&gt;
 |издание      = First Edition&lt;br /&gt;
 |издательство = O’Reilly Media&lt;br /&gt;
 |год          = 2014&lt;br /&gt;
 |pages        = 41&lt;br /&gt;
 |isbn         = 978-1-449-36503-5&lt;br /&gt;
 |archive-date  = 2015-05-10&lt;br /&gt;
 |archive-url   = https://web.archive.org/web/20150510131934/http://speakingjs.com/es5/&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, [[Си (язык программирования)|Си]], [[Scheme]]&amp;lt;ref name=&amp;quot;speaking_js_influences&amp;quot;/&amp;gt;, [[Perl]]&amp;lt;ref name=&amp;quot;speaking_js_influences&amp;quot;/&amp;gt;, [[Python]], [[Java]]&amp;lt;ref name=&amp;quot;speaking_js_influences&amp;quot;/&amp;gt;, [[AWK]]&amp;lt;ref name=&amp;quot;speaking_js_influences&amp;quot;/&amp;gt;, [[HyperTalk]]&amp;lt;ref name=&amp;quot;speaking_js_influences&amp;quot;/&amp;gt;&lt;br /&gt;
| повлиял на = [[ActionScript]], {{iw|AssemblyScript||en|AssemblyScript}}, [[CoffeeScript]], [[Dart]], [[Haxe]], {{iw|JS++||en|JS++}}, {{iw|Opa||en|Opa (programming language)}}, [[TypeScript]]&lt;br /&gt;
| расширение = .js, .cjs, .mjs&amp;lt;ref group=&amp;quot;Спецификация&amp;quot;&amp;gt;{{cite web|url=https://github.com/nodejs/node-eps/blob/master/002-es-modules.md|title=nodejs/node-eps|website=GitHub|access-date=2018-07-05|archive-date=2020-08-29|archive-url=https://web.archive.org/web/20200829024713/https://github.com/nodejs/node-eps/blob/master/002-es-modules.md|url-status=live |lang=en}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Файловый формат&lt;br /&gt;
| иконка = Crystal source.svg&lt;br /&gt;
| mime = text/javascript, application/javascript&amp;lt;ref name=&amp;quot;rfc4329&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |author        = Hoehrmann B.&lt;br /&gt;
 |datepublished = 2006-04&lt;br /&gt;
 |url           = http://www.ietf.org/rfc/rfc4329.txt&lt;br /&gt;
 |title         = RFC4329&lt;br /&gt;
 |format        = txt&lt;br /&gt;
 |publisher     = Рабочая группа сетевых технологий [[IETF|специальной комиссии интернет-разработок]]&lt;br /&gt;
 |access-date    = 2009-09-28&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |description   = Текст рабочего предложения RFC4329&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618BjkzKp?url=http://www.ietf.org/rfc/rfc4329.txt&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;HTML4.01script group=Спецификация&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |author      = W3C&lt;br /&gt;
 |date = 1999-12-24&lt;br /&gt;
 |url           = http://www.w3.org/TR/html4/interact/scripts.html#h-18.2.1&lt;br /&gt;
 |title         = 18.2.1 Элемент SCRIPT&lt;br /&gt;
 |work          = Спецификация HTML 4.01&lt;br /&gt;
 |access-date    = 2009-09-25&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |description   = Описание элемента Script&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618BkFEN1?url=http://www.w3.org/TR/html4/interact/scripts.html#h-18.2.1&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
| тип = [[текстовый файл]] с [[Исходный код|исходным кодом]]&lt;br /&gt;
| расширен = [[ECMAScript]]&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;JavaScript&#039;&#039;&#039; (англ. {{IPAc-en|ˈ|dʒ|ɑː|v|ə|s|k|r|ɪ|p|t}}; аббр. &#039;&#039;&#039;JS&#039;&#039;&#039;) — [[Мультипарадигменное программирование|мультипарадигменный]] [[язык программирования]]. Поддерживает [[Объектно-ориентированное программирование|объектно-ориентированный]], [[Императивное программирование|императивный]] и [[Функциональное программирование|функциональный]] стили. Является реализацией спецификации [[ECMAScript]] (стандарт ECMA-262&amp;lt;ref name=&amp;quot;ECMA 262&amp;quot; /&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
JavaScript обычно используется как встраиваемый язык для программного доступа к объектам [[Компьютерная программа|приложений]]. Наиболее широкое применение находит в [[браузер]]ах как [[Сценарный язык|язык сценариев]] для придания [[интерактивность|интерактивности]] [[веб-страница]]м&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
|автор          = Флэнаган Д.&lt;br /&gt;
|заглавие       = JavaScript. Карманный справочник. Сделайте веб-страницы интерактивными!&lt;br /&gt;
|ответственный  = Перевод А.Г. Сысонюк&lt;br /&gt;
|место          = Москва.&lt;br /&gt;
|издательство   = Издательский дом &amp;quot;Вильямс&amp;quot;&lt;br /&gt;
|год            = 2015&lt;br /&gt;
|страницы       = 320&lt;br /&gt;
|isbn           = 978-5-8459-1948-9 (рус.)&lt;br /&gt;
|тираж          = 1000}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основные архитектурные черты: &lt;br /&gt;
&lt;br /&gt;
* [[динамическая типизация]], &lt;br /&gt;
* [[Сильная и слабая типизация|слабая типизация]],&lt;br /&gt;
* [[Сборка мусора (программирование)|автоматическое управление памятью]], &lt;br /&gt;
* [[прототипное программирование]],&lt;br /&gt;
* функции как [[Объект первого класса|объекты первого класса]].&lt;br /&gt;
&lt;br /&gt;
На JavaScript оказали влияние многие языки, при разработке была цель сделать язык похожим на [[Java]]. Языком JavaScript не владеет какая-либо организация или компания, что отличает его от ряда [[Язык программирования|языков программирования]], используемых в веб-разработке&amp;lt;ref group=&amp;quot;~&amp;quot;&amp;gt;C#, PHP, Perl, Python, Java.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
|автор          = Д. Рейсиг&lt;br /&gt;
|часть          = 4. Инструменты отладки и тестирования&lt;br /&gt;
|заглавие       = JavaScript. Профессиональные приёмы программирования&lt;br /&gt;
|оригинал       = Pro JavaScript™ Techniques&lt;br /&gt;
|ответственный  = Перевод Н. Вильчинский&lt;br /&gt;
|место          = СПб.&lt;br /&gt;
|издательство   = [[Питер (издательство)|Питер]]&lt;br /&gt;
|год            = 2008&lt;br /&gt;
|страницы       = 76&lt;br /&gt;
|серия          = Библиотека программиста&lt;br /&gt;
|isbn           = 978-5-91180-904-1&lt;br /&gt;
|тираж          = 2500}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Название «JavaScript» является зарегистрированным [[товарный знак|товарным знаком]] корпорации [[Oracle]] в США&amp;lt;ref&amp;gt;{{cite web|title=USPTO Copyright entry #75026640|url=http://tarr.uspto.gov/servlet/tarr?regser=serial&amp;amp;entry=75026640|publisher=USPTO|access-date=2020-04-09|archive-date=2012-04-23|archive-url=https://web.archive.org/web/20120423002018/http://tarr.uspto.gov/servlet/tarr?regser=serial&amp;amp;entry=75026640|url-status=live |lang=en}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В [[1992 год]]у компания {{lang-en2|Nombas}} (впоследствии приобретённая {{нп1|Openwave}}) начала разработку встраиваемого скриптового языка {{lang-en2|Cmm}} (Си-минус-минус), который, по замыслу разработчиков, должен был стать достаточно мощным, чтобы заменить [[макрос]]ы, сохраняя при этом схожесть с [[Си (язык программирования)|Си]], чтобы разработчикам не составляло труда изучить его&amp;lt;ref name=&amp;quot;nombasHistory&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 | publisher     = Nombas&lt;br /&gt;
 | url           = http://www.nombas.com/us/scripting/history.htm&lt;br /&gt;
 | title         = History of scripting&lt;br /&gt;
 | lang          = en&lt;br /&gt;
 | archive-url    = https://web.archive.org/web/20040618115018/www.nombas.com/us/scripting/history.htm&lt;br /&gt;
 | archive-date   = 2004-06-18&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Главным отличием от Си была работа с памятью. В новом языке всё управление памятью осуществлялось автоматически: не было необходимости создавать [[Буфер (информатика)|буфера]], объявлять переменные, осуществлять преобразование типов. В остальном языки сильно походили друг на друга: в частности, {{lang-en2|Cmm}} поддерживал стандартные функции и операторы Си&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author        = Ford S., Wells D., Wells N.&lt;br /&gt;
 |datepublished = 1997-09-01&lt;br /&gt;
 |url           = http://www.objs.com/survey/lang.htm&lt;br /&gt;
 |title         = Web Programming Languages&lt;br /&gt;
 |access-date    = 2009-11-17&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618BlfJ9i?url=http://www.objs.com/survey/lang.htm&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. {{lang-en2|Cmm}} был переименован в {{lang-en2|ScriptEase}}, поскольку исходное название звучало слишком негативно, а упоминание в нём Си «отпугивало» людей&amp;lt;ref name=&amp;quot;nombasHistory&amp;quot; /&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last        = Zakas&lt;br /&gt;
 |first       = Nicholas&lt;br /&gt;
 |url         = http://www.java-samples.com/showtutorial.php?tutorialid=814&lt;br /&gt;
 |title       = History and evolution of Javascript&lt;br /&gt;
 |access-date  = 2009-11-17&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618Bm83NG?url=http://www.java-samples.com/showtutorial.php?tutorialid=814&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. На основе этого языка был создан [[Проприетарное программное обеспечение|проприетарный продукт]] {{lang-en2|CEnvi}}. В конце ноября [[1995 год]]а {{lang-en2|Nombas}} разработала версию {{lang-en2|CEnvi}}, внедряемую в веб-страницы. Страницы, которые можно было изменять с помощью [[Сценарный язык|скриптового языка]], получили название {{lang-en2|Espresso Pages}} — они демонстрировали использование скриптового языка для создания игры, проверки пользовательского ввода в формы и создания анимации. {{lang-en2|Espresso Pages}} позиционировались как [[демоверсия]], призванная помочь представить, что случится, если в браузер будет внедрён язык {{lang-en2|Cmm}}. Работали они только в 16-битовом [[Netscape Navigator]] под управлением [[Windows]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Noorda&lt;br /&gt;
 |first         = Brent&lt;br /&gt;
 |datepublished = 1995-11-27&lt;br /&gt;
 |url           = http://embedded.eecs.berkeley.edu/Respep/Research/dds/Hyper-RNweb/0052.html&lt;br /&gt;
 |title         = information blitz&lt;br /&gt;
 |access-date    = 2009-11-17&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |description   = Страница, содержащая письмо президента Nombas Брента Ноорда с анонсированием Espresso Pages&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618BmiKmv?url=http://embedded.eecs.berkeley.edu/Respep/Research/dds/Hyper-RNweb/0052.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Самая первая реализация JavaScript была создана [[Эйх, Брендан|Бренданом Эйхом]] ({{lang-en|Brendan Eich}}) в компании Netscape, и с тех пор обновляется, чтобы соответствовать ECMA-262 Edition 5 и более поздним версиям. Этот [[Движок JavaScript|движок]] называется [[SpiderMonkey]] и реализован на языке [[Си (язык программирования)|C]]/[[C++]]. Движок Rhino создан Норрисом Бойдом ({{lang-en|Norris Boyd}}) и реализован на языке [[Java]]. Как и [[SpiderMonkey]], Rhino соответствует [[ECMA-262]] Edition 5.&lt;br /&gt;
&lt;br /&gt;
== История ==&lt;br /&gt;
[[Файл:BEich.jpg|мини|125пкс|Брендан Эйх&amp;lt;ref&amp;gt;{{Книга&lt;br /&gt;
 |заглавие      = JavaScript. Библия пользователя&lt;br /&gt;
 |оригинал      = JavaScript. Bible&lt;br /&gt;
 |издание       = 5-е изд&lt;br /&gt;
 |ответственный = Денни Гудман (Danny Goodman), Майкл Моррисон (Michael Morrison); пер. с англ. {{nobr|И. В. Василенко}}&lt;br /&gt;
 |место         = Москва, Санкт-Петербург, Киев&lt;br /&gt;
 |издательство  = Дилектика&lt;br /&gt;
 |год           = 2006&lt;br /&gt;
 |страниц       = 1184&lt;br /&gt;
 |страницы      = 3, 26&lt;br /&gt;
 |isbn          = 5-8459-1027-7&lt;br /&gt;
 |тираж         = 3000&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
Перед [[Эйх, Брендан|Бренданом Эйхом]], нанятым в компанию [[Netscape Communications|Netscape]] 4 апреля [[1995 год]]а&amp;lt;ref name=&amp;quot;cwHistory&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |last          = Hamilton&lt;br /&gt;
 |first         = Naomi&lt;br /&gt;
 |datepublished = 2008-07-31&lt;br /&gt;
 |url           = http://www.computerworld.com.au/article/255293/-z_programming_languages_javascript&lt;br /&gt;
 |title         = The A-Z of Programming Languages: JavaScript&lt;br /&gt;
 |work          = a-z of programming languages&lt;br /&gt;
 |publisher     = ComputerWorld&lt;br /&gt;
 |access-date    = 2009-11-18&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618Dl788Z?url=http://www.computerworld.com.au/article/255293/-z_programming_languages_javascript&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, была поставлена задача внедрить язык программирования [[Scheme]] или что-то похожее в браузер Netscape. Поскольку требования были размыты, Эйха перевели в группу, ответственную за серверные продукты, где он проработал месяц, занимаясь улучшением протокола [[HTTP]]&amp;lt;ref name=&amp;quot;cwHistory&amp;quot;/&amp;gt;. В мае разработчик был переброшен обратно, в команду, занимающуюся клиентской частью (браузером), где он немедленно начал разрабатывать концепцию нового языка программирования. Менеджмент разработки браузера, включая Тома Пакина ({{lang-en|Tom Paquin}}), {{iw|Той, Михаэль|Михаэля Тоя|en|Michael Toy}}, Рика Шелла ({{lang-en|Rick Schell}}), был убеждён, что Netscape должен поддерживать язык программирования, встраиваемый в [[HTML]]-код страницы&amp;lt;ref name=&amp;quot;eichPopularity&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |last          = Eich&lt;br /&gt;
 |first         = Brendan&lt;br /&gt;
 |datepublished = 2008-04-03&lt;br /&gt;
 |url           = http://weblogs.mozillazine.org/roadmap/archives/2008/04/popularity.html&lt;br /&gt;
 |title         = Popularity&lt;br /&gt;
 |access-date    = 2009-11-18&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |url-status      = dead&lt;br /&gt;
 |archive-url    = https://web.archive.org/web/20080407235455/http://weblogs.mozillazine.org/roadmap/archives/2008/04/popularity.html&lt;br /&gt;
 |archive-date   = 2008-04-07&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Marc Andreessen.jpg|thumb|left|125px|Марк Андрессен]]&lt;br /&gt;
[[Файл:Bill Joy at World Economic Forum (Davos), 2003-01 (cropped).jpg|thumb|right|125px|Билл Джой]]&lt;br /&gt;
Помимо Брендана Эйха, в разработке участвовали&amp;lt;ref name=&amp;quot;cwHistory&amp;quot;/&amp;gt; сооснователь&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Frommer&lt;br /&gt;
 |first         = Dan&lt;br /&gt;
 |datepublished = 2008-06-30&lt;br /&gt;
 |url           = http://www.businessinsider.com/2008/6/marc-andreessen-joins-facebook-board&lt;br /&gt;
 |title         = Marc Andreessen Joins Facebook Board&lt;br /&gt;
 |access-date    = 2009-11-18&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618Dn2qn5?url=http://www.businessinsider.com/2008/6/marc-andreessen-joins-facebook-board&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; [[Netscape Communications]] [[Андрессен, Марк|Марк Андрессен]] и сооснователь [[Sun Microsystems]] [[Джой, Билл|Билл Джой]]: чтобы успеть закончить работы над языком к {{d-l|релиз|релизу}} браузера, компании заключили соглашение о сотрудничестве в разработке&amp;lt;ref name=&amp;quot;zakasHistory&amp;quot;&amp;gt;{{книга&lt;br /&gt;
|автор          = Zakas N.&lt;br /&gt;
|часть          = A Short History&lt;br /&gt;
|заглавие       = Professional JavaScript for Web Developers&lt;br /&gt;
|ссылка        = https://archive.org/details/professionaljava0000zaka_m7v1/page/1&lt;br /&gt;
|издание        = 2nd ed&lt;br /&gt;
|место          = USA, Canada&lt;br /&gt;
|издательство   = Wiley Publishing, Inc.&lt;br /&gt;
|год            = 2009&lt;br /&gt;
|pages          = 1, 2&lt;br /&gt;
|isbn           = 978-0-470-22780-0&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Они ставили перед собой цель обеспечить «язык для склеивания» составляющих частей веб-ресурса: изображений, плагинов, Java-апплетов, который был бы удобен для веб-дизайнеров и программистов, не обладающих высокой квалификацией&amp;lt;ref name=&amp;quot;cwHistory&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Первоначально по предложению Марка Андрессена&amp;lt;ref name=&amp;quot;first20years&amp;quot;&amp;gt;{{статья&lt;br /&gt;
| автор         = Allen Wirfs-Brock, Brendan Eich&lt;br /&gt;
| заглавие      = JavaScript: the first 20 years&lt;br /&gt;
| язык          = en&lt;br /&gt;
| том           = 4&lt;br /&gt;
| издание       = Proceedings of the ACM on Programming Languages // HOPL&lt;br /&gt;
| doi           = 10.1145/3386327&lt;br /&gt;
| издательство  = ACM&lt;br /&gt;
| год           = 2020&lt;br /&gt;
| pages         = 1—189&lt;br /&gt;
| isbn          = 1-58113-329-4&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; язык был назван Mocha&amp;lt;ref&amp;gt;{{cite web|url=https://brendaneich.com/2008/04/popularity/|title=Popularity|datepublished=2008-04-03|author=Brendan Eich|publisher=личный блог|lang=en|access-date=2015-03-18|archive-date=2015-03-16|archive-url=https://web.archive.org/web/20150316002457/https://brendaneich.com/2008/04/popularity/|url-status=live}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web|url=https://brendaneich.com/2011/06/new-javascript-engine-module-owner/|title=New JavaScript Engine Module Owner|datepublished=2011-06-21|author=Brendan Eich|publisher=личный блог|lang=en|access-date=2015-03-18|archive-date=2017-04-21|archive-url=https://web.archive.org/web/20170421060910/https://brendaneich.com/2011/06/new-javascript-engine-module-owner/|url-status=live}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=Phrasebook&amp;gt;{{Книга&lt;br /&gt;
 |заглавие      = JavaScript. Карманный справочник. Необходимый код и команды&lt;br /&gt;
 |оригинал      = JavaScript. Phrasebook. Essential code and commands&lt;br /&gt;
 |ссылка        = http://www.books.ru/books/javascript-karmannyi-spravochnik-490096/&lt;br /&gt;
 |издание       =&lt;br /&gt;
 |ответственный = Кристиан Уэнц (Cristian Wenz); пер. с англ. {{nobr|И. В. Берштейн}}&lt;br /&gt;
 |место         = Москва, Санкт-Петербург, Киев&lt;br /&gt;
 |издательство  = ООО &amp;quot;И. Д. Вильямс&amp;quot;&lt;br /&gt;
 |год           = 2008&lt;br /&gt;
 |страниц       = 272&lt;br /&gt;
 |страницы      = 18&lt;br /&gt;
 |isbn          = 978-5-8459-1186-5&lt;br /&gt;
 |тираж         = 2000&lt;br /&gt;
 |access-date   = 2015-03-23&lt;br /&gt;
 |archive-date  = 2015-04-02&lt;br /&gt;
 |archive-url   = https://web.archive.org/web/20150402221051/http://www.books.ru/books/javascript-karmannyi-spravochnik-490096/&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;, был реализован Бренданом Эйхом в течение десяти дней и впервые был включен в пре-альфу версию Netscape 2&amp;lt;ref name=&amp;quot;first20years&amp;quot;/&amp;gt;. Затем он был переименован в LiveScript&amp;lt;ref name=Phrasebook/&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url          = http://www.infoworld.com/article/2653798/application-development/javascript-creator-ponders-past--future.html&lt;br /&gt;
 |title        = JavaScript creator ponders past, future&lt;br /&gt;
 |subtitle     = Mozilla&#039;s Brendan Eich describes JavaScript&#039;s history, the upcoming upgrade, and disagreements with Microsoft&lt;br /&gt;
 |author       = Paul Krill&lt;br /&gt;
 |quote        = Eich: That’s right. It was all within six months from May till December (1995) that it was Mocha and then LiveScript. And then in early December, Netscape and Sun did a license agreement and it became JavaScript.&lt;br /&gt;
 |date         = 2008-06-23&lt;br /&gt;
 |publisher    = InfoWorld&lt;br /&gt;
 |access-date   = 2015-05-03&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |archive-date = 2014-09-20&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20140920141040/http://www.infoworld.com/article/2653798/application-development/javascript-creator-ponders-past--future.html&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; и предназначался как для программирования на стороне клиента, так и для программирования на стороне сервера (там он должен был называться LiveWire)&amp;lt;ref name=&amp;quot;zakasHistory&amp;quot;/&amp;gt;. На синтаксис оказали влияние языки [[Си (язык программирования)|Си]] и [[Java]], и, поскольку Java в то время было [[Модные слова|модным словом]]&amp;lt;ref name=&amp;quot;cwHistory&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;zakasHistory&amp;quot;/&amp;gt;, 4 декабря 1995 года LiveScript переименовали в JavaScript&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Bellis&lt;br /&gt;
 |first         = Mary&lt;br /&gt;
 |datepublished = 2008-06-30&lt;br /&gt;
 |url           = http://inventors.about.com/od/jstartinventions/a/JavaScript.htm&lt;br /&gt;
 |title         = The History of JavaScript&lt;br /&gt;
 |work          = About.com Guide&lt;br /&gt;
 |access-date    = 2009-11-18&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://archive.today/20120709161928/http://inventors.about.com/od/jstartinventions/a/JavaScript.htm&lt;br /&gt;
 |archive-date   = 2012-07-09&lt;br /&gt;
 |deadlink      = no&lt;br /&gt;
 |url-status    = dead&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, получив соответствующую лицензию у [[Sun Microsystems|Sun]]. Анонс JavaScript со стороны представителей Netscape и Sun состоялся накануне выпуска второй [[Бета-тестирование|бета-версии]] Netscape Navigator&amp;lt;ref name=&amp;quot;cwHistory&amp;quot;/&amp;gt;. В нём декларируется, что 28 лидирующих ИТ-компаний выразили намерение использовать в своих будущих продуктах JavaScript как объектный скриптовый язык с открытым стандартом&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 | publisher     = Netscape Communications, Sun Microsystems&lt;br /&gt;
 | url           = http://sunsite.nus.sg/hotjava/pr951204-03.html&lt;br /&gt;
 | title         = Netscape and Sun Announce Javascript(TM), the Open, Cross-Platform Object Scripting Language for Enterprise Networks and the Internet&lt;br /&gt;
 | access-date    = 2009-11-17&lt;br /&gt;
 | lang          = en&lt;br /&gt;
 | description   = Анонс JavaScript&lt;br /&gt;
|archive-url=https://web.archive.org/web/19961216191511/http://sunsite.nus.sg/hotjava/pr951204-03.html|archive-date=1996-12-16|url-status=dead}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В [[1996 год]]у компания [[Microsoft]] выпустила аналог языка JavaScript, названный [[Microsoft JScript|JScript]]. Анонсирован этот язык был 18 июля 1996 года&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = Microsoft&lt;br /&gt;
 |datepublished = 1996-07-18&lt;br /&gt;
 |url           = http://www.microsoft.com/presspass/press/1996/jul96/jscriptpr.mspx&lt;br /&gt;
 |title         = Microsoft Announces ActiveX Scripting&lt;br /&gt;
 |access-date    = 2009-11-17&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |description   = Анонс JScript&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DoQIOq?url=http://www.microsoft.com/presspass/press/1996/jul96/jscriptpr.mspx&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Первым браузером, поддерживающим эту реализацию, был [[Internet Explorer]] 3.0.&lt;br /&gt;
&lt;br /&gt;
По инициативе компании Netscape&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
 |автор               = Silwa C.&lt;br /&gt;
 |заглавие         = Scripting standard coming&lt;br /&gt;
 |ссылка             = https://books.google.ru/books?id=kxcEAAAAMBAJ&amp;amp;pg=PA10&amp;amp;lpg=PA10&amp;amp;dq=Netscape+submitted+the+JavaScript+specification&amp;amp;source=bl&amp;amp;ots=JEnGQvNAmu&amp;amp;sig=chtE3zvk_PmmkxWi14D6XEKyRIs&amp;amp;hl=ru&amp;amp;ei=QyEFS7f-EciB_Qbms6G4Dw&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=4&amp;amp;ved=0CB4Q6AEwAw#v=onepage&amp;amp;q=&amp;amp;f=false&lt;br /&gt;
 |язык                 = en&lt;br /&gt;
 |издание           = Network World&lt;br /&gt;
 |тип                   = журнал&lt;br /&gt;
 |издательство = IDG Network World Inc&lt;br /&gt;
 |год                   = 1996&lt;br /&gt;
 |том                   = 13&lt;br /&gt;
 |номер               = 49&lt;br /&gt;
 |страницы         = 10&lt;br /&gt;
 |archive-date              = 2013-05-17&lt;br /&gt;
 |archive-url               = https://web.archive.org/web/20130517185318/http://books.google.ru/books?id=kxcEAAAAMBAJ&amp;amp;pg=PA10&amp;amp;lpg=PA10&amp;amp;dq=Netscape+submitted+the+JavaScript+specification&amp;amp;source=bl&amp;amp;ots=JEnGQvNAmu&amp;amp;sig=chtE3zvk_PmmkxWi14D6XEKyRIs&amp;amp;hl=ru&amp;amp;ei=QyEFS7f-EciB_Qbms6G4Dw&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=4&amp;amp;ved=0CB4Q6AEwAw#v=onepage&amp;amp;q=&amp;amp;f=false&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Сибах&lt;br /&gt;
 |first         = Питер&lt;br /&gt;
 |datepublished = 2007-06-13&lt;br /&gt;
 |url           = http://www.ibm.com/developerworks/ru/library/wa-ecma/index.html&lt;br /&gt;
 |title         = Знакомимся с ECMAscript&lt;br /&gt;
 |work          = developerWorks Россия&lt;br /&gt;
 |publisher     = IBM&lt;br /&gt;
 |access-date    = 2009-11-19&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DophZS?url=http://www.ibm.com/developerworks/ru/library/wa-ecma/index.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
 |lang=ru}}&amp;lt;/ref&amp;gt; была проведена стандартизация языка ассоциацией [[ECMA International|ECMA]]. Стандартизированная версия имеет название [[ECMAScript]], описывается стандартом [[ECMA-262]]. Первой версии спецификации соответствовал JavaScript версии 1.1, а также языки JScript и ScriptEasy&amp;lt;ref name=&amp;quot;nombasHistory&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;zakasHistory&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Популярность ===&lt;br /&gt;
В статье «The World’s Most Misunderstood Programming Language Has Become the World’s Most Popular Programming Language»&amp;lt;ref name=&amp;quot;mostMisunderstood&amp;quot;/&amp;gt; ({{tr-en|Самый неправильно понятый язык программирования в мире стал самым популярным в мире языком программирования}}) [[Крокфорд, Дуглас|Дуглас Крокфорд]] утверждает, что лидирующую позицию JavaScript занял в связи с развитием [[AJAX]], поскольку браузер стал превалирующей системой доставки приложений.&lt;br /&gt;
&lt;br /&gt;
Согласно [[TIOBE Index]], базирующемуся на данных поисковых систем [[Google (поисковая система)|Google]], [[MSN]], [[Yahoo!]], [[Википедия]] и [[YouTube]], в 2024 году JavaScript находился на 6-м месте.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Год !! Положение JavaScript в TIOBE Index&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = TIOBE Software BV&lt;br /&gt;
 |datepublished = &lt;br /&gt;
 |url           = https://www.tiobe.com/tiobe-index/&lt;br /&gt;
 |title         = TIOBE Index&lt;br /&gt;
 |access-date   = 2025-02-04&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
 |archive-date  = 2023-10-15&lt;br /&gt;
 |archive-url   = https://web.archive.org/web/20231015080735/https://www.tiobe.com/tiobe-index/&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|2000 || 7&lt;br /&gt;
|-&lt;br /&gt;
|2005 || 10&lt;br /&gt;
|-&lt;br /&gt;
|2010 || 9&lt;br /&gt;
|-&lt;br /&gt;
|2015 || 8&lt;br /&gt;
|-&lt;br /&gt;
|2020 || 7&lt;br /&gt;
|-&lt;br /&gt;
|2025 || 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В рейтинге популярности [[IEEE Spectrum]] в 2024 году JavaScript занял третье место&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = builtwith.com&lt;br /&gt;
 |datepublished = 2024-08-22&lt;br /&gt;
 |url           = https://spectrum.ieee.org/top-programming-languages-2024&lt;br /&gt;
 |author        = Stephen Cass&lt;br /&gt;
 |title         = Top Programming Languages 2024&lt;br /&gt;
 |access-date   = 2025-02-05&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
 |archive-date  = 2025-02-07&lt;br /&gt;
 |archive-url   = https://web.archive.org/web/20250207054432/https://spectrum.ieee.org/top-programming-languages-2024&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
JavaScript является самым популярным языком программирования, используемым для разработки веб-приложений [[Клиент — сервер|на стороне клиента]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = builtwith.com&lt;br /&gt;
 |datepublished = 2010-07-29&lt;br /&gt;
 |url           = http://trends.builtwith.com/docinfo/Javascript&lt;br /&gt;
 |title         = Javascript Usage Statistics&lt;br /&gt;
 |access-date    = 2010-07-29&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618Ds4Nob?url=http://trends.builtwith.com/docinfo/Javascript&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = W³Techs&lt;br /&gt;
 |datepublished = 2010-07-29&lt;br /&gt;
 |url           = http://w3techs.com/technologies/overview/client_side_language/all&lt;br /&gt;
 |title         = Usage of client-side programming languages for websites&lt;br /&gt;
 |access-date    = 2010-07-29&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DsezVa?url=http://w3techs.com/technologies/overview/client_side_language/all&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Возможности языка ==&lt;br /&gt;
JavaScript является [[Объектно-ориентированное программирование|объектно-ориентированным]] языком, но используемое в языке [[Прототипное программирование|прототипирование]]&amp;lt;ref&amp;gt;{{Cite web |url=https://howtonode.org/object-graphs |title=Learning Javascript with Object Graphs. Objects and Prototype Chains |access-date=2016-10-10 |archive-date=2016-12-27 |archive-url=https://web.archive.org/web/20161227031529/https://howtonode.org/object-graphs |url-status=live  |lang=en}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web |url=https://howtonode.org/object-graphs-2 |title=Learning Javascript with Object Graphs (Part II). Pure Prototypal Objects |access-date=2016-10-10 |archive-date=2016-10-11 |archive-url=https://web.archive.org/web/20161011143050/https://howtonode.org/object-graphs-2 |url-status=live  |lang=en}}&amp;lt;/ref&amp;gt; обуславливает различия в работе с объектами по сравнению с традиционными класс-ориентированными языками. Кроме того, JavaScript имеет ряд свойств, присущих [[Функциональное программирование|функциональным языкам]] — функции как [[Объект первого класса|объекты первого класса]], объекты как списки, [[карринг]], [[анонимные функции]], [[Замыкание (программирование)|замыкания]]&amp;lt;ref&amp;gt;{{Cite web |url=https://howtonode.org/object-graphs |title=Learning Javascript with Object Graphs. Visualizing Closures |access-date=2016-10-10 |archive-date=2016-12-27 |archive-url=https://web.archive.org/web/20161227031529/https://howtonode.org/object-graphs |url-status=live  |lang=en}}&amp;lt;/ref&amp;gt; — что придаёт языку дополнительную гибкость.&lt;br /&gt;
&lt;br /&gt;
Несмотря на схожий с Си синтаксис, JavaScript по сравнению с языком [[Си (язык программирования)|Си]] имеет коренные различия:&lt;br /&gt;
* [[Объект (программирование)|объекты]] с возможностью [[Интроспекция (программирование)|интроспекции]];&lt;br /&gt;
* функции как [[Объект первого класса|объекты первого класса]];&lt;br /&gt;
* автоматическое [[приведение типов]];&lt;br /&gt;
* автоматическая [[Сборка мусора (программирование)|сборка мусора]];&lt;br /&gt;
* [[анонимные функции]].&lt;br /&gt;
&lt;br /&gt;
В языке отсутствуют такие полезные вещи&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author        = Kris Kowal&lt;br /&gt;
 |datepublished = 2009-12-01&lt;br /&gt;
 |url           = https://arstechnica.com/web/news/2009/12/commonjs-effort-sets-javascript-on-path-for-world-domination.ars&lt;br /&gt;
 |title         = CommonJS effort sets JavaScript on path for world domination&lt;br /&gt;
 |access-date    = 2009-12-01&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DtG3Xf?url=http://arstechnica.com/web/news/2009/12/commonjs-effort-sets-javascript-on-path-for-world-domination.ars&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, как:&lt;br /&gt;
&lt;br /&gt;
* [[стандартная библиотека]]: в частности, отсутствует [[интерфейс программирования приложений]] по работе с файловой системой, управлению потоками ввода-вывода, базовых типов для [[Двоичный файл|бинарных данных]];&lt;br /&gt;
* стандартные [[интерфейс]]ы к [[веб-сервер]]ам и [[база данных|базам данных]];&lt;br /&gt;
* [[система управления пакетами]]&amp;lt;ref group=&amp;quot;~&amp;quot;&amp;gt;Имеется в виде отдельной библиотеки {{iw|JSAN}}.&amp;lt;/ref&amp;gt;, которая бы отслеживала зависимости и автоматически устанавливала их.&lt;br /&gt;
&lt;br /&gt;
== Семантика и синтаксис ==&lt;br /&gt;
[[Синтаксис]] языка JavaScript во многом напоминает синтаксис Си и [[Java]], [[Семантика (программирование)|семантически]] же язык гораздо ближе к [[Self]], [[Smalltalk]] или даже [[Лисп]]у&amp;lt;ref name=&amp;quot;mostMisunderstood&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |last          = Crockford&lt;br /&gt;
 |first         = Douglas&lt;br /&gt;
 |datepublished = 2008-03-03&lt;br /&gt;
 |url           = http://javascript.crockford.com/popular.html&lt;br /&gt;
 |title         = The World&#039;s Most Misunderstood Programming Language Has Become the World&#039;s Most Popular Programming Language&lt;br /&gt;
 |access-date    = 2009-10-25&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DtmEwx?url=http://javascript.crockford.com/popular.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
|автор          = Mikkonen T., Taivalsaari A.&lt;br /&gt;
|заглавие       = Using JavaScript as a Real Programming Language&lt;br /&gt;
|ссылка         = http://www.sunlabs.com/techrep/2007/smli_tr-2007-168.pdf&lt;br /&gt;
|язык           = en&lt;br /&gt;
|место          = USA&lt;br /&gt;
|издательство   = Sun Microsystems Laboratories&lt;br /&gt;
|год            = 2007&lt;br /&gt;
|archive-url=https://web.archive.org/web/20110615055800/http://www.sunlabs.com/techrep/2007/smli_tr-2007-168.pdf|archive-date=2011-06-15|url-status=dead}}&amp;lt;/ref&amp;gt;&amp;lt;ref group=&amp;quot;Спецификация&amp;quot;&amp;gt;{{книга&lt;br /&gt;
 |автор       = TC39.&lt;br /&gt;
 |часть       = 4. Overview&lt;br /&gt;
 |заглавие    = ECMAScript Language Specification&lt;br /&gt;
 |ссылка      = http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf&lt;br /&gt;
 |издание     = 5th ed&lt;br /&gt;
 |год         = 2009&lt;br /&gt;
 |pages       = 1, 2&lt;br /&gt;
 |archive-date = 2015-04-12&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20150412040502/http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В JavaScript:&lt;br /&gt;
* все [[идентификатор]]ы регистрозависимы,&lt;br /&gt;
* в названиях переменных можно использовать [[Буква|буквы]], [[подчёркивание]], [[символ доллара]], [[арабские цифры]],&lt;br /&gt;
* названия переменных не могут начинаться с цифры,&lt;br /&gt;
* для оформления однострочных [[Комментарии (программирование)|комментариев]] используются &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;, многострочные и внутристрочные комментарии начинаются с &amp;lt;code&amp;gt;/*&amp;lt;/code&amp;gt; и заканчиваются &amp;lt;code&amp;gt;*/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Структура языка ===&lt;br /&gt;
Структурно JavaScript можно представить в виде объединения трёх чётко различимых друг от друга частей&amp;lt;ref name=&amp;quot;zakasPage3&amp;quot;&amp;gt;{{книга&lt;br /&gt;
|автор          = Zakas N.&lt;br /&gt;
|часть          = 1. What is JavaScript?&lt;br /&gt;
|заглавие       = Professional JavaScript for Web Developers&lt;br /&gt;
|ссылка        = https://archive.org/details/professionaljava0000zaka_m7v1/page/3&lt;br /&gt;
|издание        = 2nd ed&lt;br /&gt;
|место          = USA, Canada&lt;br /&gt;
|издательство   = Wiley Publishing, Inc.&lt;br /&gt;
|год            = 2009&lt;br /&gt;
|pages          = 3&lt;br /&gt;
|isbn           = 978-0-470-22780-0&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;webDef&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |last          = Zakas&lt;br /&gt;
 |first         = Nicholas&lt;br /&gt;
 |datepublished = 2009-09-29&lt;br /&gt;
 |url           = http://www.nczonline.net/blog/2009/09/29/web-definitions-dom-ajax-and-more/&lt;br /&gt;
 |title         = Web definitions: DOM, Ajax, and more&lt;br /&gt;
 |work          = блог Николаса Закаса&lt;br /&gt;
 |access-date    = 2009-12-09&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |description   = Статья, проясняющая разницу между понятиями, относящимися к веб-разработке, в которой, в частности, обосновывается, почему DOM и BOM наряду с ECMAScript рассматриваются как составные части JavaScript&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DuDeEE?url=http://www.nczonline.net/blog/2009/09/29/web-definitions-dom-ajax-and-more/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;chapmanBOM&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |last        = Chapman&lt;br /&gt;
 |first       = Stephen&lt;br /&gt;
 |url         = http://javascript.about.com/od/browserobjectmodel/a/bom01.htm&lt;br /&gt;
 |title       = The Browser Object Model. Introduction&lt;br /&gt;
 |access-date  = 2010-02-01&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20100113003830/http://javascript.about.com/od/browserobjectmodel/a/bom01.htm&lt;br /&gt;
 |archive-date = 2010-01-13&lt;br /&gt;
 |deadlink    = no&lt;br /&gt;
 |url-status  = dead&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Kvk&lt;br /&gt;
 |first         = Raja&lt;br /&gt;
 |datepublished = 2009-12-18&lt;br /&gt;
 |url           = http://vkanakaraj.wordpress.com/2009/12/18/javascript-vs-dom-vs-bom-relationship-explained/&lt;br /&gt;
 |title         = JavaScript Vs DOM Vs BOM, relationship explained&lt;br /&gt;
 |access-date    = 2009-12-18&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DvKHiD?url=http://vkanakaraj.wordpress.com/2009/12/18/javascript-vs-dom-vs-bom-relationship-explained/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;:&lt;br /&gt;
* ядро ([[ECMAScript]]),&lt;br /&gt;
* объектная модель браузера ({{iw|Browser Object Model|Browser Object Model или BOM|en|Browser Object Model}}),&lt;br /&gt;
* объектная модель документа ([[Document Object Model|Document Object Model или DOM]]).&lt;br /&gt;
&lt;br /&gt;
Если рассматривать JavaScript в отличных от браузера окружениях, то объектная модель браузера и объектная модель документа могут не поддерживаться&amp;lt;ref name=&amp;quot;chapmanBOM&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объектную модель документа иногда рассматривают как отдельную от JavaScript сущность&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
|автор          = Souders S.&lt;br /&gt;
|часть          = 1. Understanding AJAX Performance&lt;br /&gt;
|заглавие       = Even Faster Web Sites: Performance Best Practices for Web Developers&lt;br /&gt;
|ссылка        = https://archive.org/details/evenfasterwebsit0000soud/page/1&lt;br /&gt;
|издание        = 1st ed&lt;br /&gt;
|место          = USA&lt;br /&gt;
|издательство   = O&#039;Reilly Media&lt;br /&gt;
|год            = 2009&lt;br /&gt;
|pages          = 1—6&lt;br /&gt;
|isbn           = 0596522304&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
|автор = Дэвид Флэнаган.&lt;br /&gt;
|часть = 15.4.6. Независимые от языка DOM-интерфейсы&lt;br /&gt;
|заглавие = JavaScript. Подробное руководство&lt;br /&gt;
|оригинал = JavaScript. The Definite Guide&lt;br /&gt;
|ответственный = Перевод А. Киселева&lt;br /&gt;
|ссылка = https://archive.org/details/javascriptajaxdo00libg&lt;br /&gt;
|url-access = registration&lt;br /&gt;
|издание = 5-е изд&lt;br /&gt;
|место =  СПб.&lt;br /&gt;
|издательство = [[Символ-Плюс (издательство)|«Символ-Плюс»]]&lt;br /&gt;
|год = 2008&lt;br /&gt;
|страницы = [https://archive.org/details/javascriptajaxdo00libg/page/n330 332]—334&lt;br /&gt;
|isbn = 5-93286-103-7&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref group=&amp;quot;Спецификация&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = W3C&lt;br /&gt;
 |datepublished = 2004-04-07&lt;br /&gt;
 |url           = http://www.w3.org/TR/DOM-Level-3-Core/&lt;br /&gt;
 |title         = Document Object Model (DOM) Level 3 Core Specification&lt;br /&gt;
 |access-date    = 2009-11-06&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DwDYM7?url=http://www.w3.org/TR/DOM-Level-3-Core/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, что согласуется с определением DOM как независимого от языка интерфейса документа&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Stockwell&lt;br /&gt;
 |first         = Christian&lt;br /&gt;
 |datepublished = 2008-08-26&lt;br /&gt;
 |url           = http://blogs.msdn.com/ie/archive/2008/08/26/ie8-performance.aspx&lt;br /&gt;
 |title         = IE8 Performance&lt;br /&gt;
 |access-date    = 2009-11-06&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DwevYO?url=http://blogs.msdn.com/b/ie/archive/2008/08/26/ie8-performance.aspx&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. При описании целей ES-Harmony Брендан Айх рассматривает как одну из целей создания языка, что он должен хорошо подходить для создания библиотек, которые, в том числе, могут включать и DOM&amp;lt;ref&amp;gt;[http://wiki.ecmascript.org/doku.php?id=harmony:harmony&amp;amp;rev=1241476466&amp;amp;do=diff Изменение документа, описывающего ES-Harmony] {{Wayback|url=http://wiki.ecmascript.org/doku.php?id=harmony:harmony&amp;amp;rev=1241476466&amp;amp;do=diff |date=20110808193241 }}&amp;lt;/ref&amp;gt;. Согласно этой концепции DOM представляет собой встроенную библиотеку&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
| автор         = Allen Wirfs-Brock, Brendan Eich&lt;br /&gt;
| заглавие      = JavaScript: the first 20 years&lt;br /&gt;
| язык          = en&lt;br /&gt;
| том           = 4&lt;br /&gt;
| издание       = Proceedings of the ACM on Programming Languages // HOPL&lt;br /&gt;
| doi           = 10.1145/3386327&lt;br /&gt;
| издательство  = ACM&lt;br /&gt;
| год           = 2020&lt;br /&gt;
| pages         = 77:18&lt;br /&gt;
| isbn          = 1-58113-329-4&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, а JavaScript и ECMAScript эквивалентны, являясь разными названиями одной сущности&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
| автор         = Allen Wirfs-Brock, Brendan Eich&lt;br /&gt;
| заглавие      = JavaScript: the first 20 years&lt;br /&gt;
| язык          = en&lt;br /&gt;
| том           = 4&lt;br /&gt;
| издание       = Proceedings of the ACM on Programming Languages // HOPL&lt;br /&gt;
| doi           = 10.1145/3386327&lt;br /&gt;
| издательство  = ACM&lt;br /&gt;
| год           = 2020&lt;br /&gt;
| pages         = 77:5&lt;br /&gt;
| isbn          = 1-58113-329-4&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Ряд авторов находит BOM и DOM тесно взаимосвязанными&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
|автор          = Powell T., Schneider F.&lt;br /&gt;
|часть          = Chapter 9: JavaScript Object Models&lt;br /&gt;
|заглавие       = JavaScript 2.0: The Complete Reference&lt;br /&gt;
|ссылка        = https://archive.org/details/javascriptcomple0000powe&lt;br /&gt;
|издание        = 2nd ed&lt;br /&gt;
|место          = USA&lt;br /&gt;
|издательство   = McGraw-Hill/Osborne&lt;br /&gt;
|год            = 2004&lt;br /&gt;
|allpages       = 976&lt;br /&gt;
|isbn           = 0072253576&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last        = Chapman&lt;br /&gt;
 |first       = Stephen&lt;br /&gt;
 |url         = http://javascript.about.com/od/browserobjectmodel/a/bom.htm&lt;br /&gt;
 |title       = The Browser Object Model. The Basics&lt;br /&gt;
 |access-date  = 2010-02-01&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20110927231127/http://javascript.about.com/od/browserobjectmodel/a/bom.htm&lt;br /&gt;
 |archive-date = 2011-09-27&lt;br /&gt;
 |deadlink    = no&lt;br /&gt;
 |url-status  = dead&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Ядро ====&lt;br /&gt;
{{Основная статья|ECMAScript}}&lt;br /&gt;
ECMAScript не является браузерным языком и в нём не определяются методы ввода и вывода информации&amp;lt;ref name=&amp;quot;zakasPage3&amp;quot;/&amp;gt;. Это, скорее, основа для построения скриптовых языков. Спецификация ECMAScript описывает типы данных, инструкции, ключевые и [[Зарезервированное слово|зарезервированные]] слова, [[Оператор (программирование)|операторы]], объекты, [[регулярные выражения]], не ограничивая авторов производных языков в расширении их новыми составляющими.&lt;br /&gt;
&lt;br /&gt;
==== Объектная модель браузера ====&lt;br /&gt;
Объектная модель браузера — браузер-специфичная часть языка&amp;lt;ref name=&amp;quot;chapmanBOM&amp;quot;/&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last        = Chapman&lt;br /&gt;
 |first       = Stephen&lt;br /&gt;
 |url         = http://javascript.about.com/od/browserobjectmodel/Browser_Object_Model.htm&lt;br /&gt;
 |title       = The Browser Object Model&lt;br /&gt;
 |access-date  = 2009-12-09&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20111019191809/http://javascript.about.com/od/browserobjectmodel/Browser_Object_Model.htm&lt;br /&gt;
 |archive-date = 2011-10-19&lt;br /&gt;
 |deadlink    = no&lt;br /&gt;
 |url-status  = dead&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, являющаяся прослойкой между ядром и объектной моделью документа&amp;lt;ref name=&amp;quot;BOMKoch&amp;quot;&amp;gt;{{книга&lt;br /&gt;
 |автор          = Koch P.-P.&lt;br /&gt;
 |заглавие       = ppk on JavaScript&lt;br /&gt;
 |ссылка        = https://archive.org/details/ppkonjavascript00koch&lt;br /&gt;
 |часть          = Chapter 6. BOM&lt;br /&gt;
 |издание        = 1st ed&lt;br /&gt;
 |издательство   = New Riders Press&lt;br /&gt;
 |год            = 2006&lt;br /&gt;
 |allpages       = 528&lt;br /&gt;
 |isbn           = 0321423305&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Основное предназначение объектной модели браузера — управление окнами браузера и обеспечение их взаимодействия. Каждое из окон браузера представляется объектом &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;, центральным объектом DOM. Объектная модель браузера на данный момент не стандартизирована&amp;lt;ref name=&amp;quot;chapmanBOM&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;BOMZakas&amp;quot;&amp;gt;{{книга&lt;br /&gt;
|автор          = Zakas N.&lt;br /&gt;
|часть          = 8. The Browser Object Model&lt;br /&gt;
|заглавие       = Professional JavaScript for Web Developers&lt;br /&gt;
|ссылка        = https://archive.org/details/professionaljava0000zaka_m7v1/page/201&lt;br /&gt;
|издание        = 2nd ed&lt;br /&gt;
|место          = USA, Canada&lt;br /&gt;
|издательство   = Wiley Publishing, Inc.&lt;br /&gt;
|год            = 2009&lt;br /&gt;
|pages          = 201—229&lt;br /&gt;
|isbn           = 978-0-470-22780-0&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, однако спецификация находится в разработке [[WHATWG]]&amp;lt;ref name=&amp;quot;BOMKoch&amp;quot;/&amp;gt;&amp;lt;ref group=&amp;quot;Спецификация&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = W3C&lt;br /&gt;
 |datepublished = 2009-12-08&lt;br /&gt;
 |url           = http://www.whatwg.org/specs/web-apps/current-work/multipage/&lt;br /&gt;
 |title         = HTML5. Draft Standard — 8 December 2009&lt;br /&gt;
 |access-date    = 2009-12-09&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DydmQD?url=http://www.whatwg.org/specs/web-apps/current-work/multipage/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; и [[W3C]]&amp;lt;ref name=&amp;quot;webDef&amp;quot;/&amp;gt;&amp;lt;ref group=&amp;quot;Спецификация&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = W3C&lt;br /&gt;
 |datepublished = 2006-04-07&lt;br /&gt;
 |url           = http://www.w3.org/TR/2006/WD-Window-20060407/&lt;br /&gt;
 |title         = Window Object 1.0 W3C Working Draft 07 April 2006&lt;br /&gt;
 |access-date    = 2009-12-09&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618Dz7xID?url=http://www.w3.org/TR/2006/WD-Window-20060407/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Помимо управления окнами, в рамках объектной модели браузера браузерами обычно обеспечивается поддержка следующих сущностей&amp;lt;ref name=&amp;quot;BOMKoch&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;BOMZakas&amp;quot;/&amp;gt;:&lt;br /&gt;
* управление [[Фрейм (HTML)|фреймами]],&lt;br /&gt;
* поддержка задержки в исполнении кода и зацикливания с задержкой,&lt;br /&gt;
* системные диалоги,&lt;br /&gt;
* управление адресом открытой страницы,&lt;br /&gt;
* управление информацией о браузере,&lt;br /&gt;
* управление информацией о параметрах [[Монитор (устройство)|монитора]],&lt;br /&gt;
* ограниченное управление историей просмотра страниц,&lt;br /&gt;
* поддержка работы с [[HTTP cookie]].&lt;br /&gt;
&lt;br /&gt;
==== Объектная модель документа ====&lt;br /&gt;
{{Основная статья|Document Object Model}}&lt;br /&gt;
Объектная модель документа — [[интерфейс программирования приложений]] для HTML и [[XML]]-документов&amp;lt;ref name=&amp;quot;DOMZakas&amp;quot;&amp;gt;{{книга&lt;br /&gt;
|автор          = Zakas N.&lt;br /&gt;
|часть          = 10. The Document Object Model&lt;br /&gt;
|заглавие       = Professional JavaScript for Web Developers&lt;br /&gt;
|ссылка        = https://archive.org/details/professionaljava0000zaka_m7v1/page/261&lt;br /&gt;
|издание        = 2nd ed&lt;br /&gt;
|место          = USA, Canada&lt;br /&gt;
|издательство   = Wiley Publishing, Inc.&lt;br /&gt;
|год            = 2009&lt;br /&gt;
|pages          = 261—317&lt;br /&gt;
|isbn           = 978-0-470-22780-0&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Согласно DOM, документ (например, веб-страница) может быть представлен в виде дерева объектов, обладающих рядом свойств, которые позволяют производить с ним различные манипуляции:&lt;br /&gt;
* генерация и добавление узлов,&lt;br /&gt;
* получение узлов,&lt;br /&gt;
* изменение узлов,&lt;br /&gt;
* изменение связей между узлами,&lt;br /&gt;
* удаление узлов.&lt;br /&gt;
&lt;br /&gt;
=== Встраивание в веб-страницы ===&lt;br /&gt;
&lt;br /&gt;
==== Расположение внутри страницы ====&lt;br /&gt;
Для добавления JavaScript-кода на страницу можно использовать теги &amp;lt;code&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;ref group=&amp;quot;Спецификация&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = W3C&lt;br /&gt;
 |datepublished = 2013-12-18&lt;br /&gt;
 |url           = http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.1&lt;br /&gt;
 |title         = 18.2.1 The SCRIPT element&lt;br /&gt;
 |work          = Спецификация HTML 5&lt;br /&gt;
 |access-date    = 2013-06-18&lt;br /&gt;
 |lang          = ru&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DzYnzo?url=http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.1&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, которые рекомендуется, но не обязательно, помещать внутри контейнера &amp;lt;code&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/code&amp;gt;. Контейнеров &amp;lt;code&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/code&amp;gt; в одном документе может быть сколько угодно. Атрибут &amp;lt;code&amp;gt;type=&amp;quot;text/javascript&amp;quot;&amp;lt;/code&amp;gt; указывать необязательно, данное значение используется по умолчанию&amp;lt;ref name=&amp;quot;HTML5script group=Спецификация&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = W3C&lt;br /&gt;
 |datepublished = 2014-10-28&lt;br /&gt;
 |url           = http://www.w3.org/TR/html5/scripting-1.html#the-script-element&lt;br /&gt;
 |title         = 4.11.1 The script element&lt;br /&gt;
 |work          = Спецификация HTML5&lt;br /&gt;
 |access-date    = 2015-06-11&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-date  = 2015-06-13&lt;br /&gt;
 |archive-url   = https://web.archive.org/web/20150613180658/http://www.w3.org/TR/html5/scripting-1.html#the-script-element&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Скрипт, выводящий [[модальное окно]] с классической надписью «Hello, World!» внутри браузера:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;application/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  alert(&#039;Hello, World!&#039;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Расположение внутри тега ====&lt;br /&gt;
Спецификация HTML описывает набор атрибутов, используемых для задания обработчиков событий&amp;lt;ref group=&amp;quot;Спецификация&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = W3C&lt;br /&gt;
 |datepublished = 1999-12-24&lt;br /&gt;
 |url           = http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.3&lt;br /&gt;
 |title         = 18.2.3 Intrinsic events&lt;br /&gt;
 |work          = Спецификация HTML 4.01&lt;br /&gt;
 |access-date    = 2009-11-15&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618DzYnzo?url=http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.3&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Пример использования:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;delete.php&amp;quot; onclick=&amp;quot;return confirm(&#039;Вы уверены?&#039;)&amp;quot;&amp;gt;&lt;br /&gt;
  Удалить&lt;br /&gt;
&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В приведённом примере при нажатии на ссылку функция &amp;lt;code&amp;gt;confirm(&#039;Вы уверены?&#039;);&amp;lt;/code&amp;gt; вызывает модальное окно с надписью «Вы уверены?», а &amp;lt;code&amp;gt;return false;&amp;lt;/code&amp;gt; блокирует переход по ссылке. Этот код будет работать только если в браузере есть и включена поддержка JavaScript, иначе переход по ссылке произойдёт без предупреждения.&lt;br /&gt;
&lt;br /&gt;
Использование кода JavaScript в контексте разметки страницы расценивается в рамках [[Ненавязчивый JavaScript|ненавязчивого JavaScript]] как плохая практика. Аналогом (при условии снабжения ссылки идентификатором &amp;lt;code&amp;gt;alertLink&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;delete.php&amp;quot; id=&amp;quot;alertLink&amp;quot;&amp;gt;&lt;br /&gt;
  Удалить&lt;br /&gt;
&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
приведённого примера может являться, например, следующий фрагмент JavaScript:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;window.addEventListener(&#039;load&#039;, () =&amp;gt; {&lt;br /&gt;
    const linkWithAlert = document.getElementById(&#039;alertLink&#039;);&lt;br /&gt;
    linkWithAlert.addEventListener(&#039;click&#039;, async (evt) =&amp;gt; {&lt;br /&gt;
      evt.preventDefault();&lt;br /&gt;
      if (confirm(&#039;Вы уверены?&#039;)) {&lt;br /&gt;
        await fetch(&#039;delete&#039;, { method: &#039;DELETE&#039; });&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
});&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вынесение в отдельный файл ====&lt;br /&gt;
Есть и третья возможность подключения JavaScript — написать скрипт в отдельном файле, а потом подключить его с помощью конструкции&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;application/javascript&amp;quot; src=&amp;quot;http://Путь_к_файлу_со_скриптом&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Атрибуты элемента script ====&lt;br /&gt;
Элемент script, широко используемый для подключения к странице JavaScript, имеет несколько атрибутов.&lt;br /&gt;
* необязательный&amp;lt;ref name=&amp;quot;HTML5script&amp;quot; group=&amp;quot;Спецификация&amp;quot;&amp;gt;{{cite web |publisher=W3C |date=2014-10-28 |url=http://www.w3.org/TR/html5/scripting-1.html#the-script-element |title=4.11.1 The script element |work=Спецификация HTML5 |access-date=2015-06-11 |lang=en |archive-date=2015-06-13 |archive-url=https://web.archive.org/web/20150613180658/http://www.w3.org/TR/html5/scripting-1.html#the-script-element |url-status=live }}&amp;lt;/ref&amp;gt; атрибут &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; для указания [[MIME|MIME-типа]] содержимого.&lt;br /&gt;
&lt;br /&gt;
{{начало цитаты|источник=В [[RFC|рабочем предложении]] RFC-4329, определяющем&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher   = [[IANA|Администрация адресного пространства Интернет]]&lt;br /&gt;
 |url         = http://www.iana.org/assignments/media-types/application/&lt;br /&gt;
 |title       = Application Media Types&lt;br /&gt;
 |access-date  = 2009-09-28&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Соответствие типов содержимого MIME-типам&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618DzzC6J?url=http://www.iana.org/assignments/media-types/application/index.html&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; MIME-тип, соответствующий JavaScript, указано}}&amp;lt;ref name=&amp;quot;rfc4329&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Медиатипы&lt;br /&gt;
* &amp;lt;code&amp;gt;application/javascript&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;application/ecmascript&amp;lt;/code&amp;gt;,&lt;br /&gt;
которые также определяются в этом документе, предназначены для практического использования, им следует отдавать предпочтение.&lt;br /&gt;
{{oq|en|Use of the &amp;quot;text&amp;quot; top-level type for this kind of content is known to be problematic.  This document thus defines &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;text/ecmascript&amp;lt;/code&amp;gt; but marks them as &amp;quot;obsolete&amp;quot;.  Use of experimental and unregistered media types, as listed in part above, is discouraged.&lt;br /&gt;
&lt;br /&gt;
The media types,&lt;br /&gt;
* &amp;lt;code&amp;gt;application/javascript&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;application/ecmascript&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which are also defined in this document, are intended for common use and should be used instead.}}&lt;br /&gt;
{{конец цитаты}}&lt;br /&gt;
&lt;br /&gt;
* необязательный атрибут &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, принимающий в качестве значения адрес к файлу со скриптом.&lt;br /&gt;
* необязательный атрибут &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt;, используемый вместе с &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; для указания используемой кодировки внешнего файла.&lt;br /&gt;
* необязательный атрибут &amp;lt;code&amp;gt;defer&amp;lt;/code&amp;gt; указывает, что получение скрипта происходит асинхронно, но выполнение следует отложить до тех пор, пока страница не будет загружена целиком.&lt;br /&gt;
* необязательный атрибут &amp;lt;code&amp;gt;async&amp;lt;/code&amp;gt; указывает, что получение скрипта происходит асинхронно, а выполнение будет произведено сразу по завершении скачивания. Очерёдность выполнения скриптов не гарантируется.&lt;br /&gt;
&lt;br /&gt;
При этом атрибут language (&amp;lt;code&amp;gt;language=&amp;quot;JavaScript&amp;quot;&amp;lt;/code&amp;gt;), несмотря на его активное использование (в 2008 году этот атрибут был наиболее часто используемым у тега &amp;lt;code&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author        = Wilson B.&lt;br /&gt;
 |datepublished = 2008-11-14&lt;br /&gt;
 |url           = http://dev.opera.com/articles/view/mama-head-structure/#script&lt;br /&gt;
 |title         = MAMA: HEAD structure&lt;br /&gt;
 |work          = Opera Developer Community&lt;br /&gt;
 |publisher     = Opera Software&lt;br /&gt;
 |access-date    = 2009-10-14&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |description   = Статистика используемых элементов в секции head веб-документов&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618E1KhFK?url=http://dev.opera.com/articles/view/mama-head-structure/#script&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;), относится к не рекомендуемым (deprecated), отсутствует в [[DTD]], поэтому считается некорректным&amp;lt;ref name=&amp;quot;attrHTML4.01 group=Спецификация&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = W3C&lt;br /&gt;
 |datepublished = 1999-12-24&lt;br /&gt;
 |url           = http://www.w3.org/TR/html4/index/attributes.html&lt;br /&gt;
 |title         = Перечень атрибутов&lt;br /&gt;
 |work          = Спецификация HTML 4.01&lt;br /&gt;
 |access-date    = 2009-09-25&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |description   = Сводная таблица атрибутов HTML&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618E278cU?url=http://www.w3.org/TR/html4/index/attributes.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Область применения ==&lt;br /&gt;
&lt;br /&gt;
=== Веб-приложения ===&lt;br /&gt;
{{Основная статья|Веб-приложение}}&lt;br /&gt;
JavaScript используется в клиентской части веб-приложений: клиент-серверных программ, в котором клиентом является браузер, а сервером — веб-сервер, имеющих распределённую между сервером и клиентом логику. Обмен информацией в веб-приложениях происходит по сети. Одним из преимуществ такого подхода является тот факт, что клиенты не зависят от конкретной операционной системы пользователя, поэтому веб-приложения являются кроссплатформенными сервисами.&lt;br /&gt;
&lt;br /&gt;
==== AJAX ====&lt;br /&gt;
{{Основная статья|AJAX}}&lt;br /&gt;
{{Навигация|Викиучебник  = AJAX}}&lt;br /&gt;
JavaScript используется в [[AJAX]], популярном подходе к построению интерактивных пользовательских интерфейсов веб-приложений, заключающемся в «фоновом» асинхронном обмене данными браузера с веб-сервером. В результате, при обновлении данных веб-страница не перезагружается полностью и интерфейс веб-приложения становится быстрее, чем это происходит при традиционном подходе (без применения AJAX).&lt;br /&gt;
&lt;br /&gt;
==== Comet ====&lt;br /&gt;
{{Основная статья|Comet (программирование)}}&lt;br /&gt;
Comet — широкое понятие, описывающее механизм работы веб-приложений, использующих постоянные HTTP-соединения, что позволяет веб-серверу отправлять данные браузеру без дополнительного запроса со стороны браузера. Для таких приложений используются технологии, непосредственно поддерживаемые браузерами. В частности, в них широко используется JavaScript.&lt;br /&gt;
&lt;br /&gt;
==== Браузерные операционные системы ====&lt;br /&gt;
{{Основная статья|WebOS}}&lt;br /&gt;
[[Файл:EyeOSinfo.png|thumb|Пример сеанса eyeOS]]&lt;br /&gt;
JavaScript широко используется в [[WebOS|браузерных операционных системах]]. Так, например, исходный код [[IndraDesktop WebOS]] на 75 % состоит из JavaScript&amp;lt;!-- Ohloh--&amp;gt;, код браузерной операционной системы [[IntOS]] — на 70 %&amp;lt;!-- Ohloh--&amp;gt;. Доля JavaScript в исходном коде [[eyeOS]] — 5 %&amp;lt;!-- Ohloh--&amp;gt;, однако и в рамках этой операционной системы JavaScript играет важную роль, участвуя в визуализации на клиенте и являясь необходимым механизмом для коммуницирования клиента и сервера&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
|автор = eyeOS Team.&lt;br /&gt;
|часть = 5.2 The JavaScript side and the PHP side&lt;br /&gt;
|заглавие = eyeos developer manual&lt;br /&gt;
|ссылка = http://eyeos.org/download/eyeOS_Developer_Manual_0.1.0.pdf&lt;br /&gt;
|pages = 23&lt;br /&gt;
|archive-date = 2008-08-07&lt;br /&gt;
|archive-url = https://web.archive.org/web/20080807155039/http://eyeos.org/download/eyeOS_Developer_Manual_0.1.0.pdf&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Букмарклеты ===&lt;br /&gt;
{{Основная статья|Букмарклет}}&lt;br /&gt;
&lt;br /&gt;
JavaScript используется для создания небольших программ, размещаемых в закладки браузера. При этом используются URL-адреса со спецификатором &amp;lt;code&amp;gt;javascript:&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
|автор = Дэвид Флэнаган.&lt;br /&gt;
|часть = 13.4.1. Букмарклеты&lt;br /&gt;
|заглавие = JavaScript. Подробное руководство&lt;br /&gt;
|ссылка = https://archive.org/details/javascriptajaxdo00libg&lt;br /&gt;
|оригинал = JavaScript. The Definite Guide&lt;br /&gt;
|ответственный = Перевод А. Киселева&lt;br /&gt;
|издание = 5-е изд&lt;br /&gt;
|место =  СПб.&lt;br /&gt;
|издательство = [[Символ-Плюс (издательство)|«Символ-Плюс»]]&lt;br /&gt;
|год = 2008&lt;br /&gt;
|страницы = [https://archive.org/details/javascriptajaxdo00libg/page/n265 267]&lt;br /&gt;
|isbn = 5-93286-103-7&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Пользовательские скрипты в браузере ===&lt;br /&gt;
Пользовательские скрипты в браузере — это программы, написанные на JavaScript, выполняемые в браузере пользователя при загрузке страницы. Они позволяют автоматически заполнять формы, переформатировать страницы, скрывать нежелательное содержимое и встраивать желательное для отображения содержимое, изменять поведение клиентской части веб-приложений, добавлять элементы управления на страницу и т. д.&lt;br /&gt;
&lt;br /&gt;
Для управления пользовательскими скриптами в [[Mozilla Firefox]] используется расширение [[Greasemonkey]]; [[Opera]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher   = Opera Software&lt;br /&gt;
 |url         = http://www.opera.com/browser/tutorials/userjs/using/&lt;br /&gt;
 |title       = User javascript&lt;br /&gt;
 |work        = Opera tutorial&lt;br /&gt;
 |access-date  = 2009-11-27&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618E36tSi?url=http://www.opera.com/docs/userjs/using/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |datepublished = 2009-11-25&lt;br /&gt;
 |url           = http://stuff.techwhack.com/7983-ujs-manager&lt;br /&gt;
 |title         = UJS Manager for Opera makes it easy to manage userscripts&lt;br /&gt;
 |access-date    = 2009-11-27&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618E4DT4N?url=http://stuff.techwhack.com/7983-ujs-manager&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher   = Opera Software&lt;br /&gt;
 |url         = http://www.opera.com/browser/tutorials/userjs/examples/#greasemonkey&lt;br /&gt;
 |title       = Examples of use. Greasemonkey scripts&lt;br /&gt;
 |work        = Opera tutorial&lt;br /&gt;
 |access-date  = 2009-11-27&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618E4ffSq?url=http://www.opera.com/docs/userjs/examples/#greasemonkey&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; и [[Google Chrome]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://dev.chromium.org/developers/design-documents/user-scripts&lt;br /&gt;
 |title       = User Scripts&lt;br /&gt;
 |work        = The Chromium Projects&lt;br /&gt;
 |access-date  = 2010-06-04&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618E5FQtx?url=http://dev.chromium.org/developers/design-documents/user-scripts&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; предоставляют средства поддержки пользовательских скриптов и возможности для выполнения ряда скриптов Greasemonkey.&lt;br /&gt;
&lt;br /&gt;
=== Серверные приложения ===&lt;br /&gt;
Приложения, написанные на JavaScript, могут исполняться на серверах, использующих [[Java]] 6 и более поздних версий&amp;lt;ref name=&amp;quot;java6rn&amp;quot;/&amp;gt;. Это обстоятельство используется для построения серверных приложений, позволяющих обрабатывать JavaScript на стороне сервера.&lt;br /&gt;
&lt;br /&gt;
Помимо Java 6, существует ряд платформ, использующих существующие движки (интерпретаторы) JavaScript для исполнения серверных приложений. (Как правило, речь идёт о повторном использовании движков, ранее созданных для исполнения кода JavaScript в браузерах WWW.)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
 |+ Платформы исполнения серверных приложений на JavaScript&lt;br /&gt;
 !Название&lt;br /&gt;
 !Используемый движок JavaScript&lt;br /&gt;
 !Языки, на которых написан движок и платформа&lt;br /&gt;
 !Лицензия&lt;br /&gt;
 |-&lt;br /&gt;
 |Jaxer&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = Aptana Inc&lt;br /&gt;
 |datepublished = 2009&lt;br /&gt;
 |url           = http://www.jaxer.org/&lt;br /&gt;
 |title         = Create entire apps using JavaScript and Ajax&lt;br /&gt;
 |access-date    = 2009-12-22&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618E5k4N8?url=http://www.jaxer.org/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 |[[SpiderMonkey]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher   = Aptana Inc&lt;br /&gt;
 |url         = http://jaxer.org/guide/&lt;br /&gt;
 |title       = Aptana: Jaxer Guide: Introduction&lt;br /&gt;
 |access-date  = 2009-12-22&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618E6IxjQ?url=http://jaxer.org/guide/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | C++, C&amp;lt;!-- Ohloh--&amp;gt;&lt;br /&gt;
 |[[GNU General Public License#GPL v3|GPL 3]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Johnson&lt;br /&gt;
 |first         = Ryan&lt;br /&gt;
 |datepublished = 2009-08-12&lt;br /&gt;
 |url           = http://github.com/aptana/Jaxer/blob/master/server/LICENSE-JAXER.html&lt;br /&gt;
 |title         = Aptana License for Jaxer&lt;br /&gt;
 |work          = Source code Git repository&lt;br /&gt;
 |publisher     = Aptana Inc&lt;br /&gt;
 |access-date    = 2009-12-22&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618E7Mehc?url=https://github.com/aptana/Jaxer/blob/master/server/LICENSE-JAXER.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |persevere-framework&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher     = Persevere&lt;br /&gt;
 |datepublished = 2008&lt;br /&gt;
 |url           = http://persvr.org/&lt;br /&gt;
 |title         = Persevere helps you rapidly develop data-driven JavaScript-based rich internet applications.&lt;br /&gt;
 |access-date    = 2009-12-22&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618E7ocYz?url=http://persvr.org/Page/Persevere&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 |[[Rhino]]&lt;br /&gt;
 | Java&amp;lt;!-- Ohloh--&amp;gt;&lt;br /&gt;
 |[[Лицензия BSD|Модифицированная лицензия BSD]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author        = kriszyp.&lt;br /&gt;
 |datepublished = 2008-10-31&lt;br /&gt;
 |url           = http://code.google.com/p/persevere-framework/source/browse/trunk/LICENSE&lt;br /&gt;
 |title         = License&lt;br /&gt;
 |work          = Source code SVN repository&lt;br /&gt;
 |publisher     = Persevere&lt;br /&gt;
 |access-date    = 2009-12-22&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618E8GDnm?url=http://code.google.com/p/persevere-framework/source/browse/trunk/LICENSE&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |Helma&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher   = Helma.org&lt;br /&gt;
 |url         = http://helma.org/&lt;br /&gt;
 |title       = helma.org&lt;br /&gt;
 |access-date  = 2009-12-22&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618E8kmKk?url=http://helma.org/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 |[[Rhino]]&lt;br /&gt;
 | Java, JavaScript&amp;lt;!-- Ohloh--&amp;gt;&lt;br /&gt;
 | [[Лицензия BSD#Лицензии типа BSD|BSD-подобная]] Helma License 2.0&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher   = Helma.org&lt;br /&gt;
 |url         = http://helma.org/license/&lt;br /&gt;
 |title       = Helma License version 2.0&lt;br /&gt;
 |access-date  = 2009-12-22&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618E9U9fG?url=http://helma.org/license/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |v8cgi&lt;br /&gt;
 |[[V8 (движок JavaScript)|V8]]&lt;br /&gt;
 | C++, JavaScript&amp;lt;!-- Ohloh--&amp;gt;&lt;br /&gt;
 | [[Лицензия BSD]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Ondrej&lt;br /&gt;
 |last          = Zara&lt;br /&gt;
 |datepublished = 2009-09-03&lt;br /&gt;
 |url           = http://code.google.com/p/v8cgi/source/browse/trunk/LICENSE&lt;br /&gt;
 |title         = License&lt;br /&gt;
 |work          = Source code SVN repository&lt;br /&gt;
 |access-date    = 2009-12-22&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618EAbkQJ?url=http://code.google.com/p/v8cgi/source/browse/trunk/LICENSE&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |[[node.js]]&lt;br /&gt;
 |[[V8 (движок JavaScript)|V8]]&lt;br /&gt;
 | C++&amp;lt;!-- Ohloh--&amp;gt;&lt;br /&gt;
 | [[Лицензия MIT]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Ryan&lt;br /&gt;
 |last          = Dahl&lt;br /&gt;
 |datepublished = 2009-05-26&lt;br /&gt;
 |url           = http://github.com/ry/node/blob/master/LICENSE&lt;br /&gt;
 |title         = License&lt;br /&gt;
 |work          = Source code GIT repository&lt;br /&gt;
 |access-date    = 2010-01-13&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618EBbMwi?url=https://github.com/joyent/node/blob/master/LICENSE&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|gopherjs&lt;br /&gt;
|[[Go]]&lt;br /&gt;
|[[Go]]&lt;br /&gt;
|[[Лицензия BSD]]&lt;br /&gt;
|-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
JavaScript на стороне сервера используется в проектах [[Google (компания)|Google]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Steve&lt;br /&gt;
 |last          = Yegge&lt;br /&gt;
 |datepublished = 2007-06-26&lt;br /&gt;
 |url           = http://steve-yegge.blogspot.com/2007/06/rhino-on-rails.html&lt;br /&gt;
 |title         = Rhino on Rails&lt;br /&gt;
 |access-date    = 2009-12-22&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618EC29UT?url=http://steve-yegge.blogspot.com/2007/06/rhino-on-rails.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Так например, [[Google Sites]] допускает подстройку с помощью JavaScript-сценариев, исполняемых движком Rhino&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Steve&lt;br /&gt;
 |last          = Yegge&lt;br /&gt;
 |datepublished = 2008-06-14&lt;br /&gt;
 |url           = http://steve-yegge.blogspot.com/2008/06/rhinos-and-tigers.html&lt;br /&gt;
 |title         = Rhinos and Tigers&lt;br /&gt;
 |access-date    = 2009-12-22&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618ECX3L8?url=http://steve-yegge.blogspot.com/2008/06/rhinos-and-tigers.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Мобильные приложения ===&lt;br /&gt;
Перевод мобильных устройств [[Palm (КПК)|Palm]] на использование [[Palm webOS]] в качестве операционной системы с [[Mojo SDK]] в качестве [[SDK|комплекта средств разработки]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Kairer&lt;br /&gt;
 |first         = Ryan&lt;br /&gt;
 |datepublished = 2009-01-08&lt;br /&gt;
 |url           = http://www.palminfocenter.com/news/9666/palm-announces-the-palm-webos/&lt;br /&gt;
 |title         = Palm Announces the Palm webOS&lt;br /&gt;
 |access-date    = 2009-10-16&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618EDnoAo?url=http://www.palminfocenter.com/news/9666/palm-announces-the-palm-webos/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; позволил использовать JavaScript в качестве языка разработки мобильных приложений&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Целиков&lt;br /&gt;
 |first         = Дмитрий&lt;br /&gt;
 |datepublished = 2009-02-18&lt;br /&gt;
 |url           = http://soft.compulenta.ru/403136/&lt;br /&gt;
 |title         = Анонсировано первое руководство для программирования в среде Palm webOS&lt;br /&gt;
 |access-date    = 2009-10-16&lt;br /&gt;
 |archive-date  = 2009-09-16&lt;br /&gt;
 |archive-url   = https://web.archive.org/web/20090916115649/http://soft.compulenta.ru/403136/&lt;br /&gt;
 |url-status      = dead&lt;br /&gt;
 |lang=ru}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
|автор    = Allen M.&lt;br /&gt;
|заглавие = Palm webOS&lt;br /&gt;
|ссылка  = https://archive.org/details/palmwebos0000alle&lt;br /&gt;
|издательство = O&#039;Reilly Media&lt;br /&gt;
|издание  = 1st ed&lt;br /&gt;
|год      = 2009&lt;br /&gt;
|allpages = 464&lt;br /&gt;
|isbn     = 978-0-596-15525-4&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
С десятых годов для разработки мобильных приложений с использованием JavaScript для разных мобильных платформ выпускаются такие фреймворки как [[Cordova]], [[NativeScript]], [[React Native]], {{нп|Titanium SDK}}.&lt;br /&gt;
&lt;br /&gt;
Учитывая то, что JavaScript используется в таких [[Мобильное приложение#Виды приложений|подвидах мобильных приложений]] как веб-приложения и гибридные приложения, можно констатировать, что в [[Разработка приложений для мобильных устройств|разработке мобильных приложений]] в настоящее время данный язык является одним из основных.&lt;br /&gt;
&lt;br /&gt;
=== Виджеты ===&lt;br /&gt;
{{Основная статья|Элемент интерфейса}}&lt;br /&gt;
Виджет — вспомогательная мини-программа, графический модуль которой размещается в рабочем пространстве соответствующей {{iw|Движок виджетов|родительской программы|en|Widget_engine}}, служащая для украшения рабочего пространства, развлечения, решения отдельных рабочих задач или быстрого получения информации из интернета без помощи веб-браузера. JavaScript используется как для реализации виджетов, так и для реализации движков виджетов. В частности, при помощи JavaScript реализованы [[Apple Dashboard]], {{iw|Microsoft Gadgets}}, {{iw|Yahoo! Widgets}}, [[Google Gadgets]], [[Klipfolio#Klipfolio|Klipfolio]].&lt;br /&gt;
&lt;br /&gt;
=== Прикладное программное обеспечение ===&lt;br /&gt;
[[Файл:Seed. JavaScript in ruwiki.png|400px|thumb|Исходный код и скриншот JavaScript-программы, выполняемой с помощью Seed]]&lt;br /&gt;
JavaScript используется для написания [[Прикладное программное обеспечение|прикладного ПО]]. Например, с использованием [[Electron (фреймворк)|Electron]] созданы [[1Password]], [[Asana]], [[Notion]], [[Visual Studio Code]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url          = https://www.electronjs.org/apps&lt;br /&gt;
 |title        = Electron&lt;br /&gt;
 |subtitle     = Showcase&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |website      = Официальный сайт фреймворка Electron&lt;br /&gt;
 |access-date  = 2025-04-29&lt;br /&gt;
 |url-status   = live&lt;br /&gt;
 |archive-date = 2023-10-24&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20231024004730/https://www.electronjs.org/apps/&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Google Chrome OS]] в качестве прикладного ПО использует [[Веб-приложение|веб-приложения]]&amp;lt;ref&amp;gt;{{cite web |author=Sunder Pichai, Linus Upson |date=2009-07-08 |url=http://googlerussiablog.blogspot.com/2009/07/google-chrome.html |title=Представляем операционную систему Google Chrome |publisher=Блог Google Россия |access-date=2009-11-20 |lang=ru |archive-url=https://www.webcitation.org/618EKbVLE?url=http://googlerussiablog.blogspot.com/2009/07/google-chrome.html |archive-date=2011-08-22 |url-status=live }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В окружении рабочего стола [[GNOME]] имеется возможность создавать на JavaScript программы, оперирующие с библиотеками GNOME при помощи [[Gjs]], {{iw|Seed||en|Seed (programming)}}&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last        = Winship&lt;br /&gt;
 |first       = Dan&lt;br /&gt;
 |url         = http://live.gnome.org/JavaScript&lt;br /&gt;
 |title       = JavaScript - GNOME live!&lt;br /&gt;
 |publisher   = GNOME&lt;br /&gt;
 |access-date  = 2009-12-28&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618ELpZmV?url=http://live.gnome.org/JavaScript&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Манипуляция объектами приложений ===&lt;br /&gt;
JavaScript также находит применение в качестве скриптового языка доступа к объектам приложений. Платформа Mozilla ([[XUL]]/[[Gecko (движок)|Gecko]]) использует JavaScript. Среди сторонних продуктов, например, [[Sun Java Runtime Environment|Java]], начиная с версии 6, содержит встроенный интерпретатор JavaScript на базе [[Rhino]]&amp;lt;ref name=&amp;quot;java6rn&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |publisher   = Sun Microsystems, Inc.&lt;br /&gt;
 |url         = http://java.sun.com/javase/6/webnotes/&lt;br /&gt;
 |title       = Java™ SE 6 Release Notes&lt;br /&gt;
 |access-date  = 2009-11-19&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Анализ исходного кода Mozilla Firefox&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EMGwir?url=http://www.oracle.com/technetwork/java/javase/webnotes-136672.html&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Сценарии JavaScript поддерживаются в таких приложениях Adobe, как [[Adobe Photoshop]], [[Adobe Dreamweaver]], [[Adobe Illustrator]] и [[Adobe InDesign]].&lt;br /&gt;
&lt;br /&gt;
=== Офисные приложения ===&lt;br /&gt;
JavaScript используется в [[Офисный пакет|офисных приложениях]] для автоматизации рутинных действий, написания [[макрос]]ов, организации доступа со стороны веб-служб.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Office ====&lt;br /&gt;
В [[SharePoint|Excel Services]] 2010 добавились&amp;lt;ref name=&amp;quot;introJsExcel&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |last          = Stich&lt;br /&gt;
 |first         = Christian&lt;br /&gt;
 |datepublished = 2009-11-30&lt;br /&gt;
 |url           = http://blogs.msdn.com/excel/archive/2009/11/30/introducing-the-javascript-object-model-for-excel-services-in-sharepoint-2010.aspx&lt;br /&gt;
 |title         = Introducing the JavaScript Object Model for Excel Services in SharePoint 2010&lt;br /&gt;
 |access-date    = 2009-12-01&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618EMxmEy?url=http://blogs.office.com/b/microsoft-excel/archive/2009/11/30/introducing-the-javascript-object-model-for-excel-services-in-sharepoint-2010.aspx&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; два новых интерфейса программирования приложений: [[REST]] API и JavaScript Object Model ([[JSOM]]).&lt;br /&gt;
* Excel Services 2010 REST API позволяет&amp;lt;ref name=&amp;quot;restExcel&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |last          = Stich&lt;br /&gt;
 |first         = Christian&lt;br /&gt;
 |datepublished = 2009-11-04&lt;br /&gt;
 |url           = http://blogs.msdn.com/excel/archive/2009/11/04/simple-access-to-spreadsheet-data-using-the-excel-services-2010-rest-api.aspx&lt;br /&gt;
 |title         = Simple Access to Spreadsheet Data Using the Excel Services 2010 REST API&lt;br /&gt;
 |access-date    = 2009-12-01&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618ENq6u6?url=http://blogs.office.com/b/microsoft-excel/archive/2009/11/04/simple-access-to-spreadsheet-data-using-the-excel-services-2010-rest-api.aspx&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; осуществлять доступ к объектам рабочих книг, таким как таблицы, диаграммы и именованные серии данных; получать изображения, HTML, [[Atom]], рабочие книги; устанавливать значения и обновлять вычисления перед запрашиванием элементов&amp;lt;ref name=&amp;quot;restExcel&amp;quot;/&amp;gt;.&lt;br /&gt;
* JSOM даёт возможность реагировать на действия пользователя в отношении Excel Web Access ([[EWA]]), программно взаимодействовать с составляющими EWA. Использование JSOM осуществляется при помощи помещения кода JavaScript на страницу, содержащую компоненты EWA&amp;lt;ref name=&amp;quot;introJsExcel&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== OpenOffice.org ====&lt;br /&gt;
JavaScript — один из языков программирования, используемых для написания макросов в приложениях, входящих в состав OpenOffice.org&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Dr Mark Alexander Bain.&lt;br /&gt;
 |часть          = Accessing the OOo IDE&lt;br /&gt;
 |заглавие       = Learn OpenOffice.org Spreadsheet Macro Programming: OOoBasic and Calc automation&lt;br /&gt;
 |ссылка        = https://archive.org/details/isbn_9781847190970/page/8&lt;br /&gt;
 |ответственный  = Reviewer: Andrew Pitonyak&lt;br /&gt;
 |издание        = 1st&lt;br /&gt;
 |место          = Birmingham&lt;br /&gt;
 |издательство   = Packt Publishing&lt;br /&gt;
 |год            = 2006&lt;br /&gt;
 |pages          = 8—11&lt;br /&gt;
 |серия          = From Technologies to Solutions&lt;br /&gt;
 |isbn           = 1847190979&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. В OpenOffice.org интегрирован интерпретатор JavaScript Rhino&amp;lt;ref name=&amp;quot;devguide&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://framework.openoffice.org/scripting/release-0.2/javascript-devguide.html&lt;br /&gt;
 |title       = Writing Office Scripts in JavaScript&lt;br /&gt;
 |publisher   = OpenOffice.org&lt;br /&gt;
 |access-date  = 2009-12-22&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EOcGrh?url=http://framework.openoffice.org/scripting/release-0.2/javascript-devguide.html&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. По состоянию на декабрь 2009 года поддержка JavaScript носила ограниченный характер. Ограничения, присущие&amp;lt;ref name=&amp;quot;devguide&amp;quot;/&amp;gt; разработке макросов OpenOffice.org на JavaScript:&lt;br /&gt;
* среда выполнения JavaScript поддерживает загрузку лишь тех классов Java, которые развёрнуты сценарием JavaScript;&lt;br /&gt;
* среда выполнения JavaScript не предоставляет сообщения об ошибках, произошедших во время выполнения скрипта;&lt;br /&gt;
* ещё не реализована поддержка интерактивной разработки JavaScript-сценариев.&lt;br /&gt;
В OpenOffice.org имеется редактор и отладчик JavaScript-сценариев&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://wiki.services.openoffice.org/w/index.php?title=Documentation/DevGuide/Scripting/Writing_Macros&lt;br /&gt;
 |title       = Writing Macros&lt;br /&gt;
 |publisher   = OpenOffice.org&lt;br /&gt;
 |access-date  = 2009-12-22&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EPK6mI?url=http://wiki.services.openoffice.org/w/index.php?title=Documentation%2FDevGuide%2FScripting%2FWriting_Macros&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Обучение информатике ===&lt;br /&gt;
JavaScript обладает [[Пропедевтика|пропедевтической]] ценностью, позволяя сочетать при обучении [[Информатика|информатике]] интенсивную практику программирования и широту используемых технологий&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
| автор         = Reed D.&lt;br /&gt;
| заглавие      = Rethinking CS0 with JavaScript&lt;br /&gt;
| язык          = en&lt;br /&gt;
| издание       = Technical Symposium on Computer Science Education. Proceedings of the thirty-second SIGCSE technical symposium on Computer Science Education&lt;br /&gt;
| место         = Charlotte, North Carolina, United States&lt;br /&gt;
| издательство  = ACM&lt;br /&gt;
| год           = 2001&lt;br /&gt;
| страницы      = 100—104&lt;br /&gt;
| isbn          = 1-58113-329-4&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Преподавание данного языка в школе позволяет создать базу для изучения [[Веб-программирование|веб-программирования]], использовать на уроках творческие проекты&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
 |автор               = Драч А. Н.&lt;br /&gt;
 |заглавие         = Повышение педагогического мастерства в области ИКТ-образования в процессе преподавания JavaScript на факультативных занятиях&lt;br /&gt;
 |ссылка             = http://ito.1gb.ru/tezises/196.doc&lt;br /&gt;
 |издание           = Информационные технологии в образовании — 2008&lt;br /&gt;
 |тип                   = Сборник научных трудов участников VII научно-практической конференции-выставки 30 — 31 октября 2008 г.&lt;br /&gt;
 |место               = Ростов-на-Дону&lt;br /&gt;
 |издательство = Ростиздат&lt;br /&gt;
 |год                   = 2008&lt;br /&gt;
 |isbn                     = 978-5-7509-0971-1&lt;br /&gt;
 |страницы         = 63&lt;br /&gt;
 |archive-date              = 2011-05-14&lt;br /&gt;
 |archive-url               = https://web.archive.org/web/20110514155744/http://ito.1gb.ru/tezises/196.doc&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Соответствующий курс позволяет обеспечить углублённый уровень изучения информатики и его имеет смысл включать в [[Активное обучение|элективные]] курсы углублённого уровня подготовки&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
 |автор               = Босова И.Н.&lt;br /&gt;
 |заглавие         = Разработка образовательных программ по информатике на вариативной основе и индивидуальных учебных планов&lt;br /&gt;
 |ссылка             = http://ito.1gb.ru/tezises/196.doc&lt;br /&gt;
 |издание           = Информационные технологии в образовании — 2009&lt;br /&gt;
 |тип                   = Сборник научных трудов участников IX научно-практической конференции-выставки 29 — 30 октября 2009 г.&lt;br /&gt;
 |место               = Ростов-на-Дону&lt;br /&gt;
 |издательство = Ростиздат&lt;br /&gt;
 |год                   = 2009&lt;br /&gt;
 |isbn                     = 978-5-7509-0971-1&lt;br /&gt;
 |страницы         = 25—26&lt;br /&gt;
 |archive-date              = 2011-05-14&lt;br /&gt;
 |archive-url               = https://web.archive.org/web/20110514155744/http://ito.1gb.ru/tezises/196.doc&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
JavaScript — подходящий язык для обучения [[Программирование игр|программированию игр]]. По сравнению с альтернативами, он функционально достаточен, прост в изучении и в применении, снижает сложность для обучения, мотивирует обучаемых делиться своими играми с другими&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
| автор         = Wu P.&lt;br /&gt;
| заглавие      = Teaching basic game programming using JavaScript&lt;br /&gt;
| язык          = en&lt;br /&gt;
| издание       = Journal of Computing Sciences in Colleges. Papers of the Second Annual CCSC Southwestern Conference&lt;br /&gt;
| место         = Consortium for Computing Sciences in Colleges, USA&lt;br /&gt;
| издательство  = ACM&lt;br /&gt;
| год           = 2009&lt;br /&gt;
| выпуск        = 4&lt;br /&gt;
| том           = 24&lt;br /&gt;
| страницы      = 211—220&lt;br /&gt;
| issn          = 1937-4771&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не включённые в книгу [[Закас, Николас|Николаса Закаса]] «Professional JavaScript for Web Developers» части о реализации на JavaScript классических [[алгоритм]]ов, техник, [[Структура данных|структур данных]], послужили&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Zakas&lt;br /&gt;
 |first         = Nikolas&lt;br /&gt;
 |datepublished = 2009-04-13&lt;br /&gt;
 |url           = http://www.nczonline.net/blog/2009/04/13/computer-science-in-javascript-linked-list/&lt;br /&gt;
 |title         = Computer science in JavaScript: Linked list&lt;br /&gt;
 |work          = [http://www.nczonline.net/blog/tag/computer-science/ Computer Science]&lt;br /&gt;
 |access-date    = 2009-11-12&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618EQ9yZI?url=http://www.nczonline.net/blog/2009/04/13/computer-science-in-javascript-linked-list/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; началу проекта &#039;&#039;Computer science in JavaScript&#039;&#039;&amp;lt;ref group=&amp;quot;~&amp;quot;&amp;gt;[http://github.com/nzakas/computer-science-in-javascript Проект &#039;Computer science in JavaScript&#039;] {{Wayback|url=http://github.com/nzakas/computer-science-in-javascript |date=20090917085753 }} включает набор классических [[Парадигма программирования|парадигм]], алгоритмов и подходов, написанных на JavaScript и доступных под [[Лицензия MIT|лицензией MIT]].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Библиотеки JavaScript ==&lt;br /&gt;
{{Основная статья|Библиотека JavaScript}}&lt;br /&gt;
&lt;br /&gt;
Для обеспечения высокого [[Слой абстрагирования|уровня абстракции]] и достижения приемлемой степени [[Кросс-браузерность|кросс-браузерности]], при разработке веб-приложений используются библиотеки JavaScript. Они представляют собой набор многократно используемых объектов и функций.&lt;br /&gt;
&lt;br /&gt;
Известные JavaScript-библиотеки:&lt;br /&gt;
{{столбцы}}&lt;br /&gt;
{{столбец}}&lt;br /&gt;
* [[React.js]],&lt;br /&gt;
* [[Vue.js]], &lt;br /&gt;
* [[Ember.js]], &lt;br /&gt;
* [[Spry|Adobe Spry]], &lt;br /&gt;
* [[AngularJS]], &lt;br /&gt;
{{столбец}}&lt;br /&gt;
* [[Svelte]], &lt;br /&gt;
* [[Dojo]], &lt;br /&gt;
* [[Extjs]], &lt;br /&gt;
* [[jQuery]], &lt;br /&gt;
* [[Mootools]], &lt;br /&gt;
{{столбец}}&lt;br /&gt;
* [[Prototype (фреймворк)|Prototype]], &lt;br /&gt;
* [[Qooxdoo]],&lt;br /&gt;
* [[Underscore]].&lt;br /&gt;
{{столбцы/конец}}&lt;br /&gt;
== Отладка ==&lt;br /&gt;
В JavaScript доступ к [[отладчик]]ам становится особенно полезным при разработке крупных нетривиальных программ из-за различий в реализациях разных браузеров (в частности, в отношении [[Document Object Model|объектной модели документа]]). Во многих браузерах есть встроенный отладчик.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer имеет три отладчика: [[Microsoft Visual Studio]] — самый полный из них, за ним следует {{iw|Microsoft Script Editor}} (компонент [[Microsoft Office]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher   = Microsoft&lt;br /&gt;
 |url         = http://msdn2.microsoft.com/en-us/library/aa202668(office.11).aspx&lt;br /&gt;
 |title       = About the programming environment&lt;br /&gt;
 |work        = [[Microsoft Developer Network]]&lt;br /&gt;
 |access-date  = 2009-11-05&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EVz5Qf?url=http://msdn.microsoft.com/en-us/library/aa202668(office.11).aspx&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;), и, наконец, свободный Microsoft Script Debugger, гораздо более простой, чем два других. Бесплатный Microsoft Visual Web Developer Express предоставляет ограниченную версию с отладочной функцией JavaScript в Microsoft Visual Studio. В восьмой версии в IE вместе с инструментами для разработчиков появился встроенный отладчик.&lt;br /&gt;
&lt;br /&gt;
В Opera также имеется собственный отладчик — [[Opera Dragonfly]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://www.opera.com/dragonfly/&lt;br /&gt;
 |title       = Opera DragonFly&lt;br /&gt;
 |publisher   = Opera Software&lt;br /&gt;
 |access-date  = 2009-12-19&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EWbOQ4?url=http://www.opera.com/dragonfly/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
 |lang=en}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разрабатываемые веб-приложения в [[Firefox]] можно отлаживать при помощи встроенных инструментов Firefox Developer Tools.&lt;br /&gt;
&lt;br /&gt;
В Safari входит отладчик JavaScript WebKit Web Inspector&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Hatcher&lt;br /&gt;
 |first         = Timothy&lt;br /&gt;
 |datepublished = 2006-06-28&lt;br /&gt;
 |url           = http://webkit.org/blog/61/introducing-drosera/&lt;br /&gt;
 |title         = Introducing Drosera&lt;br /&gt;
 |access-date    = 2009-11-05&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618EXEkVr?url=http://www.webkit.org/blog/61/introducing-drosera/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Этот же отладчик доступен и в других браузерах, использующих [[WebKit]]: Google Chrome, [[Arora]], [[Rekonq]], [[Midori (браузер)|Midori]] и др.&lt;br /&gt;
&lt;br /&gt;
== Средства тестирования ==&lt;br /&gt;
Большинство {{iw|Фреймворк автоматизированного тестирования|фреймворков автоматизированного тестирования|en|Test automation framework}} JavaScript-кода предполагают запуск тестов в браузере. Это осуществляется при помощи HTML-страницы, являющейся {{iw|Контекст тестирования|контекстом тестирования|en|Test fixture}}, которая, в свою очередь загружает всё необходимое для осуществления тестирования. Первыми такими фреймворками были {{iw|JsUnit||en|JSUnit}} (создан в 2001 году), [[Selenium]] (создан в 2004 году)&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = Chapter 1. Automated Testing&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n23 3]&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Альтернатива — запуск тестов из командной строки. В этом случае используются окружения, отличные от браузера, например, Rhino&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.1.4. Features of xUnit Test Frameworks. The Test Runner&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n43 24], 25&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Одним из первых инструментов такого рода является Crosscheck, позволяющий тестировать код, эмулируя поведение Internet Explorer 6 и Firefox версий 1.0 и 1.5&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.3.1. Crosscheck&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n47 28]&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Другой пример фреймворка автоматизированного тестирования JavaScript-кода, не использующего браузер для запуска тестов — библиотека env.js, созданная Джоном Резигом. Она использует Rhino и при этом содержит эмуляцию окружения браузера и DOM&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.3.2. env.js&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n47 28], 29&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Blue Ridge, плагин к фреймворку веб-приложений [[Ruby on Rails]], позволяет осуществлять [[модульное тестирование]] JavaScript-кода как в браузере, так и вне его. Это достигается за счёт использования фреймворка автоматизированного тестирования Screw.Unit и Rhino с env.js&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.3.3. Blue Ridge&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n48 29]&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Главная проблема систем тестирования, не использующих браузеры, в том, что они используют эмуляции, а не реальные окружения, в которых выполняется код. Это приводит к тому, что успешное прохождение тестов не гарантирует того, что код корректно отработает в браузере&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.3.4. The Issue With Headless Test Runners&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n48 29]&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = C. Titus Brown, Gheorghe Gheorghiu, Jason Huggins.&lt;br /&gt;
 |часть          = 3.1. A Brief History of Selenium&lt;br /&gt;
 |заглавие       = An Introduction to Testing Web Applications with twill and Selenium&lt;br /&gt;
 |издательство   = O&#039;Reilly Media, Inc&lt;br /&gt;
 |год            = 2007&lt;br /&gt;
 |allpages       = 60&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Проблемой систем тестирования, использующих браузер, является сложность работы с ними, необходимость осуществления рутинных неавтоматизированных действий&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.4. One Test Runner To Rule Them All&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n48 29]&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Для решения этого JsTestDriver, фреймворк автоматизированного тестирования, разрабатываемый Google, использует сервер, взаимодействующий с браузерами для осуществления тестирования&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.4.1. How JsTestDriver Works&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n48 29]&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Сходным образом ведёт себя Selenium Remote Control, входящий во фреймворк автоматизированного тестирования Selenium: он включает в себя сервер, запускающий и завершающий браузеры и действующий как HTTP-прокси для запросов к ним&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://seleniumhq.org/projects/remote-control/&lt;br /&gt;
 |title       = Selenium Remote-Control&lt;br /&gt;
 |publisher   = seleniumhq.org&lt;br /&gt;
 |access-date  = 2010-03-16&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EXmkGR?url=http://seleniumhq.org/projects/remote-control/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Кроме того, в Selenium содержится Selenium Grid, позволяющий осуществлять одновременное тестирование JavaScript-кода на разных компьютерах с разными окружениями, уменьшая время выполнения тестов&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author       = Ismayle de Sousa Santos&lt;br /&gt;
 |coauthors    = Pedro de Alcântara dos Santos Neto&lt;br /&gt;
 |url          = http://www.ufpi.br/ercemapi/arquivos/file/minicurso/mc2.pdf&lt;br /&gt;
 |title        = Automação de testes funcionais com o Selenium&lt;br /&gt;
 |format       = pdf&lt;br /&gt;
 |access-date   = 2010-03-16&lt;br /&gt;
 |lang         = pt&lt;br /&gt;
 |archive-date = 2016-03-14&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20160314063935/http://ufpi.br/ercemapi/arquivos/file/minicurso/mc2.pdf&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Testswarm, имеющее поддержку фреймворков автоматизированного тестирования JavaScript-кода QUnit (библиотека [[jQuery]]), UnitTestJS (библиотека [[Prototype (фреймворк)|Prototype]]), JSSpec (библиотека [[MooTools]]), JsUnit, Selenium и Dojo Objective Harness, представляет собой распределённое средство поддержки [[Непрерывная интеграция|непрерывной интеграции]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last          = Резиг&lt;br /&gt;
 |first         = Джон&lt;br /&gt;
 |author-link    = Резиг, Джон&lt;br /&gt;
 |datepublished = 2009-08-25&lt;br /&gt;
 |url           = https://wiki.github.com/jeresig/testswarm/&lt;br /&gt;
 |title         = TestSwarm&lt;br /&gt;
 |access-date    = 2010-03-16&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |url-status      = dead&lt;br /&gt;
 |archive-url    = https://web.archive.org/web/20100214004213/http://wiki.github.com/jeresig/testswarm/&lt;br /&gt;
 |archive-date   = 2010-02-14&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Негативное свойство, которым может обладать фреймворк автоматизированного тестирования JavaScript-кода — наличие зависимостей. Это создаёт риск отказа в работе тестируемого кода, успешно проходящего тесты, в среде с отсутствием этих зависимостей. Например, исходная версия JsUnitTest, фреймворка, созданного и использовавшегося для тестирования библиотеки Prototype, зависела от самой Prototype, изменяющего свойства объектов в глобальной области видимости&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.1.6. Dependencies&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n44 25]&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Включение в [[Библиотека JavaScript|библиотеку JavaScript]] инструмента тестирования — распространённая практика. Так YUI Test 3 является частью [[Yahoo! UI Library]] и может быть безопасно использован для тестирования произвольного JavaScript-кода&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.2.1. YUI Test&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n45 26]&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. QUnit — фреймворк автоматизированного тестирования, созданный разработчиками jQuery&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
 |автор          = Christian Johansen.&lt;br /&gt;
 |часть          = 3.2.2. Other In-Browser Testing Frameworks&lt;br /&gt;
 |заглавие       = Test Driven JavaScript Development&lt;br /&gt;
 |ссылка        = https://archive.org/details/testdrivenjavasc00joha_599&lt;br /&gt;
 |издательство   = Addison-Wesley Professional&lt;br /&gt;
 |год            = 2010&lt;br /&gt;
 |pages          = [https://archive.org/details/testdrivenjavasc00joha_599/page/n47 28]&lt;br /&gt;
 |серия          = Rough Cuts&lt;br /&gt;
 |isbn           = 0-321-68391-9, 978-0-321-68391-5&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Связь с другими языками ==&lt;br /&gt;
&lt;br /&gt;
=== Взаимное влияние ===&lt;br /&gt;
Стандартизация JavaScript потребовала уйти от проблем с торговыми марками, поэтому стандарт ECMA 262 называет язык ECMAScript, три редакции которого были опубликованы с начала работы над ним в ноябре 1996 года.&lt;br /&gt;
&lt;br /&gt;
[[Objective-J]] — это строгое компактное надмножество JavaScript, в котором к JavaScript добавлено:&lt;br /&gt;
* традиционное наследование,&lt;br /&gt;
* динамическая диспетчеризация методов в стиле [[Smalltalk]]/[[Objective-C]],&lt;br /&gt;
* псевдостатичная типизация.&lt;br /&gt;
&lt;br /&gt;
[[VBScript]] от [[Microsoft]], подобно JavaScript, может выполняться на стороне клиента в веб-страницах. VBScript имеет синтаксис, производный от [[Visual Basic]] и поддерживается только в [[Internet Explorer]].&lt;br /&gt;
&lt;br /&gt;
[[JSON]], или объектная нотация JavaScript, это формат обмена данными общего назначения, определённый как подмножество JavaScript.&lt;br /&gt;
&lt;br /&gt;
[[Scheme]] также является родственным JavaScript языком, поскольку оба представляют богатые возможности функционального программирования: JavaScript является динамическим языком, поддерживает гибкие массивы, может легко симулировать s-выражения, имеет поддержку [[Лямбда-выражения|лямбда-выражений]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last        = Крокфорд&lt;br /&gt;
 |first       = Дуглас&lt;br /&gt;
 |url         = http://www.crockford.com/javascript/little.html&lt;br /&gt;
 |title       = Малыш-программист на JavaScript&lt;br /&gt;
 |access-date  = 2009-09-28&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |description = Статья, раскрывающая связь между JavaScript и Scheme&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618Eb1Dd9?url=http://www.crockford.com/javascript/little.html&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== JavaScript и Java ====&lt;br /&gt;
Общим заблуждением является то, что JavaScript аналогичен или тесно связан с [[Java]], это не так&amp;lt;ref name=&amp;quot;mostMisunderstood&amp;quot;/&amp;gt;. Оба языка имеют C-подобный синтаксис, являются объектно-ориентированными и, как правило, широко используются в клиентских веб-приложениях. Из важных различий можно отметить:&lt;br /&gt;
* Java реализует ООП подход, основанный на [[Класс (программирование)|классах]], JavaScript — на [[Прототипное программирование|прототипах]];&lt;br /&gt;
* Java имеет [[Статическая типизация|статическую типизацию]], JavaScript — [[Динамическая типизация|динамическую типизацию]];&lt;br /&gt;
* Java загружается из скомпилированного байт-кода; JavaScript интерпретируется напрямую из файла (но часто с незаметной [[JIT]]-компиляцией).&lt;br /&gt;
&lt;br /&gt;
=== Реализация ===&lt;br /&gt;
На JavaScript реализованы интерпретаторы ряда языков программирования, что позволяет использовать для них как среду выполнения веб-браузер. Им можно найти применение, например, в образовательных целях&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author       = Толксдорф Р.&lt;br /&gt;
 |date = 2009-07-19&lt;br /&gt;
 |url          = http://www.is-research.de/info/jslanguages/&lt;br /&gt;
 |title        = Языки программирования для JavaScript&lt;br /&gt;
 |access-date   = 2009-10-12&lt;br /&gt;
 |publisher    = is-research&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |description  = Подборка реализаций языков программирования на JavaScript.&lt;br /&gt;
 |archive-url   = https://www.webcitation.org/618EbRgQQ?url=http://www.is-research.de/info/vmlanguages//&lt;br /&gt;
 |archive-date  = 2011-08-22&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
HotRuby — [[Свободное программное обеспечение|свободная]] реализация виртуальной машины [[Ruby]] на JavaScript и [[Adobe &amp;lt;!-- ? --&amp;gt;Flash|Flash]]. Позволяет выполнять [[байт-код]], полученный в результате компиляции [[YARV]]. Реализует большую часть грамматики Ruby. Пока не реализован механизм исключений и большая часть встроенных функций и классов&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://code.google.com/p/hotruby/&lt;br /&gt;
 |title       = hotruby. Ruby on JavaScript and Flash&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EcSGe6?url=http://code.google.com/p/hotruby/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. При помощи HotRuby на веб-страницах можно использовать ruby-скрипты. Для этого ruby-код следует поместить в блок:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;text/ruby&amp;quot;&amp;gt; … &amp;lt;/script&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
HotRuby выделит его, пошлёт на компиляцию удалённому скрипту и затем отобразит результаты работы на странице&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author       = Cooper P.&lt;br /&gt;
 |date = 2008-03-26&lt;br /&gt;
 |url          = http://www.rubyinside.com/hotruby-a-javascript-flash-virtual-machine-that-runs-ruby-821.html&lt;br /&gt;
 |title        = HotRuby: A JavaScript &amp;amp; Flash Virtual Machine That Runs Ruby&lt;br /&gt;
 |access-date   = 2009-10-12&lt;br /&gt;
 |publisher    = Ruby Inside&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |archive-url   = https://www.webcitation.org/618Ecu9OX?url=http://www.rubyinside.com/hotruby-a-javascript-flash-virtual-machine-that-runs-ruby-821.html&lt;br /&gt;
 |archive-date  = 2011-08-22&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. Данная реализация позволяет осуществлять доступ из Ruby к объектам JavaScript&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author       = Шустер В.&lt;br /&gt;
 |date = 2008-03-27&lt;br /&gt;
 |url          = http://www.infoq.com/news/2008/03/hotruby-ruby-yarv-in-javascript&lt;br /&gt;
 |title        = HotRuby — Ruby 1.9/YARV opcode interpreter in Javascript&lt;br /&gt;
 |access-date   = 2009-10-12&lt;br /&gt;
 |publisher    = infoQ&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |description  = Описание HotRuby.&lt;br /&gt;
 |archive-url   = https://www.webcitation.org/618EdWgRt?url=http://www.infoq.com/news/2008/03/hotruby-ruby-yarv-in-javascript&lt;br /&gt;
 |archive-date  = 2011-08-22&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
 |+ Таблица реализаций языков программирования на JavaScript&lt;br /&gt;
 !Язык&lt;br /&gt;
 !Название реализации&lt;br /&gt;
 !Основные авторы&lt;br /&gt;
 !Лицензия&lt;br /&gt;
 |-&lt;br /&gt;
 |JavaScript&lt;br /&gt;
 |s-mr&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first       = Andrei&lt;br /&gt;
 |last        = Formiga&lt;br /&gt;
 |url         = http://code.google.com/p/s-mr/&lt;br /&gt;
 |title       = s-mr. Self-made Rhino&lt;br /&gt;
 |access-date  = 2009-12-09&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EeL9Oe?url=http://code.google.com/p/s-mr/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 |Andrei Formiga&lt;br /&gt;
 | [[Лицензии BSD|New BSD]]&lt;br /&gt;
 |-&lt;br /&gt;
 |[[PostScript]]&lt;br /&gt;
 |rowspan=&amp;quot;2&amp;quot; |WPS&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first       = Tom&lt;br /&gt;
 |last        = Hlavaty&lt;br /&gt;
 |url         = http://logand.com/sw/wps/index.html&lt;br /&gt;
 |title       = WPS: PostScript for the Web&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EemdrN?url=http://logand.com/sw/wps/index.html&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 |rowspan=&amp;quot;2&amp;quot; |Tom Hlavaty&lt;br /&gt;
 |rowspan=&amp;quot;2&amp;quot; | ?&lt;br /&gt;
 |-&lt;br /&gt;
 | [[PDF]]&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Язык ассемблера|Ассемблер]] для [[MOS Technology 6502]]&lt;br /&gt;
 | 6502asm&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://www.6502asm.com/&lt;br /&gt;
 |title       = 6502asm.com — 6502 compatible assembler and emulator in javascript&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EfOEew?url=http://www.6502asm.com/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Stian Soreng&lt;br /&gt;
 | [[GPL]]&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Objective-J]]&lt;br /&gt;
 |Cappuccino&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://cappuccino.org/&lt;br /&gt;
 |title       = Cappuccino Web Framework — Build Desktop Class Applications in Objective-J and JavaScript&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618Efp1iL?url=http://cappuccino.org/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Ross Boucher&lt;br /&gt;
 | [[LGPL]]&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Haskell]]&lt;br /&gt;
 |ycr2js&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://www.haskell.org/haskellwiki/Yhc/Javascript/Brief_overview&lt;br /&gt;
 |title       = Yhc/Javascript/Brief overview&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EgLBAs?url=http://www.haskell.org/haskellwiki/Yhc/Javascript/Brief_overview&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Tom Shackell, Neil Mitchell, Andrew Wilkinson, Mike Dodds, Bob Davie, Dimitry Golubovsky&lt;br /&gt;
 | simple permissive license&lt;br /&gt;
 |-&lt;br /&gt;
 |rowspan=&amp;quot;2&amp;quot; |[[Prolog]]&lt;br /&gt;
 |Monash Toy Prolog&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://courses.cs.vt.edu/~cs1104/TowerOfBabel/Prolog/Instructions.html&lt;br /&gt;
 |title       = Monash Toy Prolog&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618Egw78a?url=http://courses.cs.vt.edu/~cs1104/TowerOfBabel/Prolog/Instructions.html&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Lloyd Allison&lt;br /&gt;
 | ?&lt;br /&gt;
 |-&lt;br /&gt;
 |ioctl&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://ioctl.org/logic/prolog-latest&lt;br /&gt;
 |title       = ioctl. Prolog in JavaScript&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EhM6jV?url=http://ioctl.org/logic/prolog-latest&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Jan Grant&lt;br /&gt;
 | ?&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Cat (язык программирования)|Cat]]&lt;br /&gt;
 |Cat Interpreter&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://cat-language.com/interpreter.html&lt;br /&gt;
 |title       = Online Cat Interpreter&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EhpNv2?url=http://cat-language.com/interpreter.html&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Christopher Diggins&lt;br /&gt;
 | [[Общественное достояние]]&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Scheme]]&lt;br /&gt;
 |BiwaScheme&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://www.biwascheme.org&lt;br /&gt;
 |title       = BiwaScheme&lt;br /&gt;
 |access-date  = 2018-03-29&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EiHwBM?url=http://www.biwascheme.org/status.html&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Yutaka Hara&lt;br /&gt;
 | [[Лицензии MIT|MIT]]&lt;br /&gt;
 |-&lt;br /&gt;
 |[[BASIC]]&lt;br /&gt;
 |Quite BASIC&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first        = Nikko&lt;br /&gt;
 |last         = Strom&lt;br /&gt;
 |date = 2006&lt;br /&gt;
 |url          = http://www.quitebasic.com/about/&lt;br /&gt;
 |title        = About Quite BASIC&lt;br /&gt;
 |access-date   = 2009-10-12&lt;br /&gt;
 |lang         = en&lt;br /&gt;
 |archive-url   = https://www.webcitation.org/618EioXqE?url=http://www.quitebasic.com/about/&lt;br /&gt;
 |archive-date  = 2011-08-22&lt;br /&gt;
 |url-status     = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Nikko Strom&lt;br /&gt;
 | [[Freeware|бесплатная]] [[Проприетарное программное обеспечение|проприетарная]]&lt;br /&gt;
 |-&lt;br /&gt;
 |{{iw|Lily||en|Lily (software)}}&lt;br /&gt;
 |Lily&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first       = Bill&lt;br /&gt;
 |last        = Orcutt&lt;br /&gt;
 |url         = http://www.lilyapp.org/about/&lt;br /&gt;
 |title       = About Lily&lt;br /&gt;
 |access-date  = 2010-02-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EjGdl8?url=http://www.lilyapp.org/about/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Bill Orcutt&lt;br /&gt;
 | [[Лицензии MIT|MIT]]&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Forth]]&lt;br /&gt;
 |wForth&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Kyle&lt;br /&gt;
 |last          = Jacobson&lt;br /&gt;
 |datepublished = 2008-12-03&lt;br /&gt;
 |url           = http://solidcoding.blogspot.com/2008/12/wforth-javascript-forth-interpreter.html&lt;br /&gt;
 |title         = wForth - A JavaScript Forth Interpreter&lt;br /&gt;
 |access-date    = 2010-02-12&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618EjktaA?url=http://solidcoding.blogspot.com/2008/12/wforth-javascript-forth-interpreter.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | K Jacobson&lt;br /&gt;
 | ?&lt;br /&gt;
 |-&lt;br /&gt;
 |[[PHP]]&lt;br /&gt;
 | phype&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |publisher   = code.google.com&lt;br /&gt;
 |url         = http://code.google.com/p/phype/&lt;br /&gt;
 |title       = phype&lt;br /&gt;
 |access-date  = 2010-02-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EkWIkO?url=http://code.google.com/p/phype/&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;!-- Ohloh--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
 |[[Python|Python 3]]&lt;br /&gt;
 | PyPy.js&lt;br /&gt;
 | ?&lt;br /&gt;
 | ?&lt;br /&gt;
|-&lt;br /&gt;
 |[[Оберон (язык программирования)|Oberon 07]]&lt;br /&gt;
 |oberonjs&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 | url         = https://github.com/vladfolts/oberonjs&lt;br /&gt;
 | title         = Oberon 07 compiler&lt;br /&gt;
 | access-date         = 2018-03-29&lt;br /&gt;
 | lang         = en&lt;br /&gt;
 | archive-date         = 2018-06-11&lt;br /&gt;
 | archive-url         = https://web.archive.org/web/20180611013620/https://github.com/vladfolts/oberonjs&lt;br /&gt;
 | url-status         = live&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
 | Vlad Folts&lt;br /&gt;
 | [[Лицензии MIT|MIT]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Взаимодействие ===&lt;br /&gt;
В некоторых языках программирования существуют средства поддержки взаимодействия с JavaScript-кодом.&lt;br /&gt;
&lt;br /&gt;
* Для [[PHP]] имеется пакет HTML Javascript, предоставляющий интерфейс создания простых JavaScript-программ&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://pear.php.net/package-info.php?pacid=93&lt;br /&gt;
 |title       = Package Information: HTML_Javascript&lt;br /&gt;
 |work        = PEAR — PHP Extension and Application Repository&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618ElXwJV?url=http://pear.php.net/package-info.php?pacid=93&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Соответствующий пакет для [[Tcl]] называется ::javascript. Он предоставляет команды генерации кода HTML и JavaScript&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://tcllib.sourceforge.net/doc/javascript.html&lt;br /&gt;
 |title       = TCLLIB — Tcl Standard Library: javascript&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618Em5w2r?url=http://tcllib.sourceforge.net/doc/javascript.html&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Пакет для [[Perl]] Data::JavaScript позволяет переносить структуры данных Perl в JavaScript-код&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = http://search.cpan.org/dist/Data-JavaScript/JavaScript.pm&lt;br /&gt;
 |title       = Data::JavaScript&lt;br /&gt;
 |work        = Comprehensive Perl Archive Network&lt;br /&gt;
 |access-date  = 2009-10-12&lt;br /&gt;
 |lang        = en&lt;br /&gt;
 |archive-url  = https://www.webcitation.org/618EmX2L8?url=http://search.cpan.org/dist/Data-JavaScript/JavaScript.pm&lt;br /&gt;
 |archive-date = 2011-08-22&lt;br /&gt;
 |url-status    = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Безопасность ==&lt;br /&gt;
JavaScript позволяет потенциальным авторам вредоносного кода запускать его на любом компьютере сети: для этого достаточно открыть на нём веб-страницу. Это обуславливает наличие двух принципиальных ограничений:&lt;br /&gt;
* JavaScript-программы выполняются в [[Песочница (безопасность)|песочнице]], в которой они могут выполнять только ограниченный круг действий, а не задачи программирования общего назначения (например, создание файлов, работа с [[Сокет (программный интерфейс)|сокетами]])&amp;lt;ref name=&amp;quot;flanSandbox&amp;quot;&amp;gt;{{книга&lt;br /&gt;
|автор = Флэнаган Д.&lt;br /&gt;
|часть = 13.8.1. Чего не может JavaScript&lt;br /&gt;
|заглавие = JavaScript. Подробное руководство&lt;br /&gt;
|ссылка = https://archive.org/details/javascript00libg_457&lt;br /&gt;
|оригинал = JavaScript. The Definite Guide&lt;br /&gt;
|ответственный = Перевод А. Киселева&lt;br /&gt;
|издание = 5-е изд&lt;br /&gt;
|место =  СПб.&lt;br /&gt;
|издательство = [[Символ-Плюс (издательство)|«Символ-Плюс»]]&lt;br /&gt;
|год = 2008&lt;br /&gt;
|страницы = [https://archive.org/details/javascript00libg_457/page/n276 280], 281&lt;br /&gt;
|isbn = 5-93286-103-7&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;,&lt;br /&gt;
* для JavaScript-кода применяется [[правило ограничения домена]], в соответствии с которым скрипт, встроенный в страницу, не может получить доступ к ряду свойств объектов другой страницы (в частности, к большинству свойств объекта &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;) при отличии в [[Протоколы передачи данных|протоколе]], [[хост]]е и номере [[Порт (TCP/IP)|порта]] этих страниц&amp;lt;ref&amp;gt;{{книга&lt;br /&gt;
|автор = Флэнаган Д.&lt;br /&gt;
|часть = 13.8.2. Политика общего происхождения&lt;br /&gt;
|заглавие = JavaScript. Подробное руководство&lt;br /&gt;
|ссылка = https://archive.org/details/javascript00libg_457&lt;br /&gt;
|оригинал = JavaScript. The Definite Guide&lt;br /&gt;
|ответственный = Перевод А. Киселева&lt;br /&gt;
|издание = 5-е изд&lt;br /&gt;
|место =  СПб.&lt;br /&gt;
|издательство = [[Символ-Плюс (издательство)|«Символ-Плюс»]]&lt;br /&gt;
|год = 2008&lt;br /&gt;
|страницы = [https://archive.org/details/javascript00libg_457/page/n277 281]—283&lt;br /&gt;
|isbn = 5-93286-103-7&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Помимо этого, разработчики браузеров вносят дополнительные ограничения в ответ на имеющие место злоупотребления. Так появился, в частности, запрет на открытие окна, размер одной стороны которого меньше ста [[пиксел]]ей&amp;lt;ref name=&amp;quot;flanSandbox&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Межсайтовые уязвимости ===&lt;br /&gt;
{{Основная статья|Межсайтовый скриптинг|Подделка межсайтовых запросов}}&lt;br /&gt;
Общая проблема, касающаяся JavaScript — [[межсайтовый скриптинг]] или XSS, нарушение правила ограничения домена. Уязвимости XSS имеют место в ситуациях, когда злоумышленник имеет возможность поместить скрипт на страницу, которая показывается пользователю. В этом случае скрипт получает доступ к сайту с правами этого пользователя, что в ряде случаев открывает возможность отсылки конфиденциальной информации, осуществление нежелательных [[Транзакция (информатика)|транзакций]].&lt;br /&gt;
&lt;br /&gt;
Уязвимости XSS также происходят из-за ошибок, допущенных разработчиками браузеров&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |datepublished = 2004-02-28&lt;br /&gt;
 |url           = http://www.mozillazine.org/talkback.html?article=4392&lt;br /&gt;
 |title         = Mozilla Cross-Site Scripting Vulnerability Reported and Fixed&lt;br /&gt;
 |publisher     = MozillaZine&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618Gt5sMQ?url=http://www.mozillazine.org/talkback.html?article=4392&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Другим типом межсайтовой уязвимости является подделка межсайтовых запросов или CSRF. Она заключается в возможности сайта злоумышленника заставить браузер пользователя осуществить нежелательное действие на целевом сайте (например, банковский перевод денег). Такая возможность имеется, если целевой сайт полагается только на [[HTTP cookie]] или запросы авторизации. В этом случае запросы, инициализированные кодом сайта злоумышленника выполняются так же как запросы пользователя, если он [[Авторизация|авторизован]] на целевом сайте. Одним из средств защиты от CSRF является осуществление [[Аутентификация|аутентификации]] при любом запросе, который приводит к необратимым последствиям. Также может помочь анализ [[HTTP referer]].&lt;br /&gt;
&lt;br /&gt;
=== Неуместное доверие на стороне клиента ===&lt;br /&gt;
Разработчики клиентских приложений, вне зависимости от того, используют они JavaScript или нет, должны осознавать, что последние могут находиться под контролем злоумышленников. Поэтому любая проверка на стороне клиента может быть обойдена, JavaScript может быть как запущен, так и нет. Код, подвергнувшийся [[Обфускация (программное обеспечение)|обфускации]], может стать объектом [[Обратная разработка|обратной разработки]]; данные формы могут быть посланы на сервер, минуя [[Валидация|валидацию]], осуществляемую с помощью JavaScript; скрипты могут быть отключены частично, поэтому, например, надёжную защиту от сохранения изображений с помощью JavaScript осуществить нельзя&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Thor&lt;br /&gt;
 |last          = Kottelin&lt;br /&gt;
 |datepublished = 2008-06-17&lt;br /&gt;
 |url           = http://blog.anta.net/2008/06/17/right-click-“protection”-forget-about-it/&lt;br /&gt;
 |title         = Right-click “protection”? Forget about it&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618GtbF4O?url=http://blog.anta.net/2008/06/17/right-click-%E2%80%9Cprotection%E2%80%9D-forget-about-it/&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = dead&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;; чрезвычайно неосмотрительно внедрять пароль в JavaScript, исполняемый на клиенте, где он может быть найден злоумышленником.&lt;br /&gt;
&lt;br /&gt;
=== Ошибки в браузере, плагинах и расширениях ===&lt;br /&gt;
JavaScript предоставляет интерфейс к широкому спектру возможностей браузера, некоторые из которых могут содержать ошибки, приводящие, например, к [[Переполнение буфера|переполнению буфера]]. Это позволяет писать скрипты, приводящие к исполнению произвольного кода на пользовательской системе.&lt;br /&gt;
&lt;br /&gt;
Подобные ошибки выявлялись у часто используемых браузеров, включая Mozilla Firefox&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Mikolaj J.&lt;br /&gt;
 |last          = Habryn&lt;br /&gt;
 |datepublished = 2006-03-01&lt;br /&gt;
 |url           = http://www.mozilla.org/security/announce/2006/mfsa2006-38.html&lt;br /&gt;
 |title         = Buffer overflow in crypto.signText()&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618Gu6XMN?url=http://www.mozilla.org/security/announce/2006/mfsa2006-38.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, Internet Explorer&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Paul&lt;br /&gt;
 |last          = Festa&lt;br /&gt;
 |datepublished = 1998-08-19&lt;br /&gt;
 |url           = http://news.cnet.com/2100-1001-214620.html&lt;br /&gt;
 |title         = Buffer-overflow bug in IE&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618Gudf0t?url=http://news.cnet.com/2100-1001-214620.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, Safari&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |datepublished = 2006-03-02&lt;br /&gt;
 |url           = http://securitytracker.com/alerts/2006/Mar/1015713.html&lt;br /&gt;
 |title         = Apple Safari JavaScript Buffer Overflow Lets Remote Users Execute Arbitrary Code and HTTP Redirect Bug Lets Remote Users Access Files&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-date  = 2010-02-18&lt;br /&gt;
 |archive-url   = https://web.archive.org/web/20100218102849/http://securitytracker.com/alerts/2006/Mar/1015713.html&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;. При выявлении потенциально опасных ошибок в браузере и наличия сведений о реализованных [[эксплойт]]ах фирма-производитель и эксперты по безопасности рекомендуют отключать JavaScript до выхода [[патч]]а&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Nick&lt;br /&gt;
 |last          = Farrell&lt;br /&gt;
 |datepublished = 2009-11-24&lt;br /&gt;
 |url           = http://news.cnet.com/2100-1001-214620.html&lt;br /&gt;
 |title         = Turn off Javascript in IE again&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618Gudf0t?url=http://news.cnet.com/2100-1001-214620.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author        = Web User.&lt;br /&gt;
 |datepublished = 2009-11-24&lt;br /&gt;
 |url           = http://www.webuser.co.uk/news/top-stories/432076/microsoft-issues-ie-flaw-advice&lt;br /&gt;
 |title         = Microsoft issues IE flaw advice&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
 |archive-date  = 2021-08-09&lt;br /&gt;
 |archive-url   = https://web.archive.org/web/20210809095229/https://adservice.google.com/adsid/integrator.js?domain=subscribe.webuser.co.uk&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Плагин]]ы, такие как [[Медиапроигрыватель|плееры]], [[Macromedia Flash]] и ряд [[ActiveX]] компонент, доступных по умолчанию в Internet Explorer, могут также содержать ошибки, эксплуатируемые с помощью JavaScript, что уже случалось ранее&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |author        = hdm.&lt;br /&gt;
 |datepublished = 2006-07-17&lt;br /&gt;
 |url           = http://www.securityfocus.com/bid/19030/info&lt;br /&gt;
 |title         = Microsoft WebViewFolderIcon ActiveX Control Buffer Overflow Vulnerability&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618GvpOtg?url=http://www.securityfocus.com/bid/19030/info&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |datepublished = 2002-03-01&lt;br /&gt;
 |url           = http://www.fusionauthority.com/security/3234-macromedia-flash-activex-buffer-overflow.htm&lt;br /&gt;
 |title         = Macromedia Flash Activex Buffer Overflow&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618GwPiuw?url=http://www.fusionauthority.com/security/3234-macromedia-flash-activex-buffer-overflow.htm&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Расширение (Mozilla)|Расширения Mozilla Firefox]] не изолированы друг от друга: одно расширение может исправлять другое, что может использоваться злоумышленниками. На конференции &#039;&#039;SecurityByte &amp;amp; Owasp AppSec Asia 2009&#039;&#039; Роберто Сагги Ливерани (Roberto Suggi Liverani) и Ник Фримэн (Nick Freeman) продемонстрировали три [[эксплойт]]а в популярных расширениях Firefox, загруженные с сайта более 30 миллионов раз&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |datepublished = 2009-11-20&lt;br /&gt;
 |url           = http://www.net-security.org/secworld.php?id=8527&lt;br /&gt;
 |title         = Zero-day vulnerabilities in Firefox extensions discovered&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618Gwvt1j?url=http://www.net-security.org/secworld.php?id=8527&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ошибки реализации песочницы ===&lt;br /&gt;
Браузеры могут запускать JavaScript вне песочницы с привилегиями, необходимыми, например, для создания и удаления файлов. Однако такие привилегии не должны даваться коду из веба.&lt;br /&gt;
&lt;br /&gt;
Неправильное наделение привилегиями JavaScript из веба служило причиной уязвимостей как Internet Explorer&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = Art&lt;br /&gt;
 |last          = Manion&lt;br /&gt;
 |datepublished = 2004-06-03&lt;br /&gt;
 |url           = https://www.kb.cert.org/vuls/id/713878&lt;br /&gt;
 |title         = Microsoft Internet Explorer does not properly validate source of redirected frame&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-date  = 2009-10-30&lt;br /&gt;
 |archive-url   = https://web.archive.org/web/20091030051811/http://www.kb.cert.org/vuls/id/713878/&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;, так и Mozilla Firefox&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |datepublished = 2005&lt;br /&gt;
 |url           = http://www.mozilla.org/security/announce/2005/mfsa2005-41.html&lt;br /&gt;
 |title         = Privilege escalation via DOM property overrides&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618GxgMka?url=http://www.mozilla.org/security/announce/2005/mfsa2005-41.html&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Microsoft Windows]] позволяет файлам с кодом JavaScript запускаться как обычным программам без того, чтобы быть помещёнными в песочницу. Это делает возможным создание [[Троянская программа|троянских программ]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |first         = John&lt;br /&gt;
 |last          = Canavan&lt;br /&gt;
 |datepublished = 2003-10-01&lt;br /&gt;
 |url           = http://www.symantec.com/security_response/writeup.jsp?docid=2003-100111-0931-99&lt;br /&gt;
 |title         = JS.Seeker.K&lt;br /&gt;
 |access-date    = 2009-11-24&lt;br /&gt;
 |lang          = en&lt;br /&gt;
 |archive-url    = https://www.webcitation.org/618GyBelK?url=http://www.symantec.com/security_response/writeup.jsp?docid=2003-100111-0931-99&lt;br /&gt;
 |archive-date   = 2011-08-22&lt;br /&gt;
 |url-status      = live&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Рефакторинг кода на JavaScript: улучшение проекта существующего кода, 2-е изд&lt;br /&gt;
|оригинал =&lt;br /&gt;
|автор = Фаулер, Мартин&lt;br /&gt;
|страниц = 464&lt;br /&gt;
|isbn = 978-5-907144-59-0&lt;br /&gt;
|год = 2019&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = JavaScript и jQuery: исчерпывающее руководство&lt;br /&gt;
|оригинал =&lt;br /&gt;
|автор = Макфарланд, Дэвид&lt;br /&gt;
|страниц = 880&lt;br /&gt;
|isbn = 978-5-699-79119-4&lt;br /&gt;
|год = 2015&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Javascript для детей&lt;br /&gt;
|оригинал =&lt;br /&gt;
|автор = Морган, Ник&lt;br /&gt;
|страниц = 288&lt;br /&gt;
|isbn = 978-5-00100-295-6&lt;br /&gt;
|год = 2016&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Javascript и jQuery. Интерактивная веб-разработка&lt;br /&gt;
|оригинал =&lt;br /&gt;
|автор = Дакетт, Джон&lt;br /&gt;
|страниц = 640&lt;br /&gt;
|isbn = 978-5-699-80285-2&lt;br /&gt;
|год = 2017&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство =&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Секреты Javascript ниндзя 2-е изд.&lt;br /&gt;
|оригинал =&lt;br /&gt;
|автор = Резиг Джон, Бибо Беэр, Марас Иосип&lt;br /&gt;
|страниц = 544&lt;br /&gt;
|isbn = 978-5-9908911-8-0&lt;br /&gt;
|год = 2017&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript, CSS и HTML5. 4-е изд. — СПб.&lt;br /&gt;
|оригинал =&lt;br /&gt;
|автор = Никсон Р.&lt;br /&gt;
|страниц = 768&lt;br /&gt;
|isbn = 978-5-496-02146-3&lt;br /&gt;
|год = 2016&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга|заглавие=JavaScript: карманный справочник, 3-е изд|оригинал=|автор=Флэнаrан, Дэвид|страниц=320|isbn=978-5-8459-1830-7|год=2013|место=М.|издательство=}}&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
=== Спецификации ===&lt;br /&gt;
{{примечания|group=&amp;quot;Спецификация&amp;quot;|2}}&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
{{Примечания|2|group=&amp;quot;~&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
=== Документация ===&lt;br /&gt;
* [https://ecma-international.org/wp-content/uploads/ECMA-262_15th_edition_june_2024.pdf 15-я редакция спецификации ECMA-262]{{ref|en}}&lt;br /&gt;
* [https://developer.mozilla.org/ru/docs/Web/JavaScript Mozilla. Документация по JavaScript]{{ref|ru}}&lt;br /&gt;
&lt;br /&gt;
=== Справочники ===&lt;br /&gt;
* [http://www.webdevout.net/browser-support-ecmascript/ Поддержка ECMAScript браузерами]{{ref|en}}&lt;br /&gt;
* [http://www.webdevout.net/browser-support-dom/ Поддержка DOM браузерами]{{ref|en}}&lt;br /&gt;
&lt;br /&gt;
=== Тематические ресурсы ===&lt;br /&gt;
* [http://javascript.crockford.com/ Крокфорд Д. JavaScript Дугласа Крокфорда]{{ref|en}}&lt;br /&gt;
* [https://github.com/HowProgrammingWorks/Index Курс лекций по программированию на JavaScript в КПИ]{{ref|ru}}&lt;br /&gt;
&lt;br /&gt;
=== Блоги известных авторов книг по JavaScript ===&lt;br /&gt;
* [http://www.nczonline.net/ Блог Николаса Закаса]{{ref|en}}&lt;br /&gt;
* [http://ejohn.org/blog/ Блог Джона Резига]{{ref|en}}&lt;br /&gt;
* [http://www.phpied.com/ Блог Стояна Стефанова]{{ref|en}}&lt;br /&gt;
* [http://www.davidflanagan.com/ Блог Дэвида Флэнагана]{{ref|en}}&lt;br /&gt;
&lt;br /&gt;
{{JavaScript}}&lt;br /&gt;
{{ECMAScript}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:JavaScript| ]]&lt;br /&gt;
[[Категория:Появились в 1995 году в США]]&lt;br /&gt;
[[Категория:Языки с динамической типизацией]]&lt;br /&gt;
[[Категория:Статьи с примерами кода JavaScript]]&lt;br /&gt;
[[Категория:Языки веб-программирования]]&lt;br /&gt;
[[Категория:Высокоуровневые языки программирования]]&lt;br /&gt;
[[Категория:Прототипно-ориентированные языки программирования]]&lt;/div&gt;</summary>
		<author><name>31.41.59.210</name></author>
	</entry>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=XHTML&amp;diff=14191</id>
		<title>XHTML</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=XHTML&amp;diff=14191"/>
		<updated>2026-03-22T08:03:08Z</updated>

		<summary type="html">&lt;p&gt;31.41.59.210: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Файловый формат&lt;br /&gt;
| название = XHTML&lt;br /&gt;
| icon = &lt;br /&gt;
| logo = XHTML.svg&lt;br /&gt;
| screenshot = &lt;br /&gt;
| caption = &lt;br /&gt;
| type code = &lt;br /&gt;
| uniform type = &lt;br /&gt;
| magic = &lt;br /&gt;
| latest release version = 1.1 (Second Edition)&lt;br /&gt;
| latest release date = [[27 марта]] [[2018 год]]а&lt;br /&gt;
| creatorcode = &lt;br /&gt;
| genre = [[Язык разметки]]&lt;br /&gt;
| container for = &lt;br /&gt;
| contained by = &lt;br /&gt;
| extended to = &lt;br /&gt;
| standard = [https://www.w3.org/TR/2000/REC-xhtml1-20000126/ 1.0 (Recommendation)], &amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.w3.org/TR/2002/REC-xhtml1-20020801/ 1.0 SE (Recommendation)], &amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.w3.org/TR/2001/REC-xhtml11-20010531/ 1.1 (Recommendation)], &amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.w3.org/TR/2010/REC-xhtml11-20101123/ 1.1 SE (Working Draft)]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.w3.org/TR/2018/SPSD-xhtml11-20180327/ 1.1 Second Edition (Working Draft)], &amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.w3.org/TR/html51/ 5 (Working Draft)], &amp;lt;br /&amp;gt; [https://www.w3.org/TR/xhtml2/ 2.0 (Working Draft)]&lt;br /&gt;
| free = &lt;br /&gt;
| url = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{HTML}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;XHTML&#039;&#039;&#039; ({{lang-en|e&#039;&#039;&#039;x&#039;&#039;&#039;tensible &#039;&#039;&#039;h&#039;&#039;&#039;yper&#039;&#039;&#039;t&#039;&#039;&#039;ext &#039;&#039;&#039;m&#039;&#039;&#039;arkup &#039;&#039;&#039;l&#039;&#039;&#039;anguage}} — &#039;&#039;расширяемый язык гипертекстовой разметки&#039;&#039;) — семейство [[Язык разметки|языков разметки]] [[Веб-страница|веб-страниц]] на основе [[XML]], повторяющих и расширяющих возможности [[HTML]]. Спецификации XHTML 1.0 и XHTML 1.1 являются рекомендациями [[W3C|консорциума Всемирной паутины]]. Развитие XHTML остановлено; новые версии XHTML не выпускаются.&lt;br /&gt;
&lt;br /&gt;
Главное отличие XHTML от HTML заключается в обработке документа.&lt;br /&gt;
Документы XHTML обрабатываются своим модулем ([[парсер]]ом) аналогично документам XML. В процессе этой обработки ошибки, допущенные разработчиками, не исправляются.&lt;br /&gt;
&lt;br /&gt;
XHTML соответствует спецификации [[SGML]], поскольку [[XML]] является её подмножеством.&lt;br /&gt;
HTML обладает множеством особенностей в процессе обработки и фактически перестал относиться к семейству SGML, что и закреплено в черновике спецификации HTML 5.&lt;br /&gt;
&lt;br /&gt;
Браузер выбирает [[Синтаксический анализатор|парсер]] для обработки документа на основании заголовка &#039;&#039;content-type&#039;&#039;, полученного от сервера:&lt;br /&gt;
* HTML — text/html&lt;br /&gt;
* XHTML — application/xhtml+xml&lt;br /&gt;
* Для локального просмотра на клиенте выбор основывается на [[Расширение имени файла|расширении файла]]{{уточнить}}&amp;lt;!-- какие именно --&amp;gt;.&lt;br /&gt;
* В [[Internet Explorer]] вплоть до 8-й версии парсер обработки XHTML-документов отсутствует.&lt;br /&gt;
&lt;br /&gt;
Декларация DOCTYPE может не оказывать никакого влияния на определение парсера для обработки (зависит от используемого браузера).&lt;br /&gt;
&lt;br /&gt;
== Различия между XHTML и HTML ==&lt;br /&gt;
Согласно синтаксису XHTML:&lt;br /&gt;
* все элементы должны быть закрыты. Теги, которые не имеют закрывающего тега (например, &amp;lt;code&amp;gt;&amp;amp;lt;img&amp;gt;&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;&amp;amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;), должны иметь на конце &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;&amp;amp;lt;br&amp;amp;nbsp;/&amp;gt;&amp;lt;/code&amp;gt;);&lt;br /&gt;
* логические [[Атрибут (языки разметки)|атрибуты]] записываются в развёрнутой форме. Например, следует писать &amp;lt;code&amp;gt;&amp;amp;lt;option selected=&amp;quot;selected&amp;quot;&amp;gt;&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;&amp;amp;lt;td nowrap=&amp;quot;nowrap&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* имена тегов и атрибутов должны быть записаны строчными буквами (например, &amp;lt;code&amp;gt;&amp;amp;lt;img alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;&amp;amp;lt;IMG ALT=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;);&lt;br /&gt;
* XHTML гораздо строже относится к ошибкам в коде; &amp;amp;lt; и &amp;amp;amp; везде, даже в [[URL]], должны замещаться &amp;amp;amp;lt; и &amp;amp;amp;amp; соответственно. По рекомендации [[W3C]] браузеры, встретив ошибку в XHTML, должны сообщить о ней и не обрабатывать документ. Для HTML браузеры должны были попытаться понять, что хотел сказать автор;&lt;br /&gt;
* кодировкой по умолчанию является [[UTF-8]] (в отличие от HTML, где кодировкой по умолчанию является [[ISO 8859-1]]).&lt;br /&gt;
&lt;br /&gt;
Для XHTML-страниц рекомендуется задавать [[MIME]]-тип — &amp;lt;code&amp;gt;application/xhtml+xml&amp;lt;/code&amp;gt;, но это не является обязательным, более того — браузер Internet Explorer 8 и младшие версии не смогут обрабатывать страницу, поэтому с XHTML 1.0 традиционно используется MIME-тип для HTML — &amp;lt;code&amp;gt;text/html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует три типа документов XHTML: strict, transitional и frameset.&lt;br /&gt;
Наиболее употребительной и универсальной из версий XHTML является переходная ({{lang-en|transitional}}), поскольку она позволяет использовать &amp;lt;code&amp;gt;iframe&amp;lt;/code&amp;gt; (включение содержимого одной веб-страницы в другую) и атрибут &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; у ссылок (для указания того, например, что ссылке необходимо открываться в новом окне). Фреймовая версия ({{lang-en|frameset}}) представляет собой расширенный вариант transitional и добавляет к нему, как следует из названия, возможность установки &amp;lt;code&amp;gt;frameset&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;. DTD (({{lang-en|&#039;&#039;&#039;d&#039;&#039;&#039;ocument &#039;&#039;&#039;t&#039;&#039;&#039;ype &#039;&#039;&#039;d&#039;&#039;&#039;efinition}}) определение типа документа) строгой версии XHTML ({{lang-en|strict}}) не содержит многих тегов и атрибутов, описанных в DTD transitional и признанных устаревшими.&lt;br /&gt;
&lt;br /&gt;
== Версии XHTML ==&lt;br /&gt;
&lt;br /&gt;
=== XHTML 1.0 ===&lt;br /&gt;
Спецификация XHTML 1.0 одобрена в качестве рекомендации консорциума Всемирной паутины [[26 января]] [[2000 год]]а. [[1 августа]] [[2002 год]]а была опубликована вторая редакция спецификации.&lt;br /&gt;
&lt;br /&gt;
XHTML 1.0 определяет три [[DTD|типа документов]] (по аналогии с HTML 4):&lt;br /&gt;
* &#039;&#039;XHTML-1.0-Strict&#039;&#039;: тип, исключающий использование всех [[Элементы HTML|элементов]] и атрибутов, задающих графическое отображение (например, элемент &amp;lt;code&amp;gt;font&amp;lt;/code&amp;gt; или атрибут &amp;lt;code&amp;gt;bgcolor&amp;lt;/code&amp;gt;). Это наиболее предпочтительный тип документов.&lt;br /&gt;
* &#039;&#039;XHTML-1.0-Transitional&#039;&#039;: тип, допускающий использование элементов и атрибутов, задающих графическое отображение. Указанные элементы рекомендуется использовать только при необходимости, например, для облегчения миграции документов c HTML 3.2 на XHTML.&lt;br /&gt;
* &#039;&#039;XHTML-1.0-Frameset&#039;&#039;: тип, добавляющий к возможностям &#039;&#039;XHTML-1.0-Transitional&#039;&#039; использование [[Фрейм (HTML)|фреймов]].&lt;br /&gt;
&lt;br /&gt;
=== XHTML 1.1 ===&lt;br /&gt;
* &#039;&#039;XHTML 1.1 Модульный&#039;&#039; ({{lang-en|module-based}}): авторы могут импортировать дополнительные свойства в их разметку.&lt;br /&gt;
&lt;br /&gt;
=== XHTML Basic и XHTML MP ===&lt;br /&gt;
* &#039;&#039;XHTML Основной&#039;&#039; ({{lang-en|basic}}): специальная облегчённая версия XHTML для устройств, которые не могут использовать полный набор элементов XHTML — в основном используется в миниатюрных устройствах, таких как мобильные телефоны. Подразумевается, что он заменит [[WML]] и [[C-HTML]].&lt;br /&gt;
* &#039;&#039;XHTML мобильного профиля ({{lang-en|mobile profile}})&#039;&#039;: основанный на XHTML Basic, добавляет специфические элементы для мобильных телефонов.&lt;br /&gt;
&lt;br /&gt;
=== XHTML 2.0 ===&lt;br /&gt;
{{main|XHTML 2.0}}&lt;br /&gt;
&lt;br /&gt;
XHTML 2.0 является последней версией XHTML. Эта версия не достигла статуса рекомендации: деятельность рабочей группы XHTML 2.0 была прекращена в конце [[2010 год]]а, а все ресурсы перенесены в рабочую группу [[HTML 5]]&amp;lt;ref&amp;gt;[http://www.w3.org/News/2009#entry-6601 Новость на сайте консорциума] {{Wayback|url=http://www.w3.org/News/2009#entry-6601 |date=20110127222518 }}{{ref|en}}&amp;lt;/ref&amp;gt;. Достигнутые результаты работы над XHTML 2.0 были опубликованы [[16 декабря]] [[2010 год]]а в виде отчёта рабочей группы ({{lang-en|working group note}}).&lt;br /&gt;
&lt;br /&gt;
== Валидация документов XHTML ==&lt;br /&gt;
[[Валидность|Валидным]] (то есть отвечающим всем правилам) XHTML-документом считается документ, удовлетворяющий спецификации. В идеале все [[браузер]]ы должны следовать веб-стандартам и, в соответствии с ними, валидные документы должны отображаться во всех браузерах на всех платформах. Валидация XHTML-документа рекомендована даже несмотря на то, что она не гарантирует [[Кросс-браузерность|кросс-браузерности]]. Соответствие документа спецификации может быть проверено на сайте [http://validator.w3.org/ validator.w3.org]. При валидации будут обнаружены ошибки в XHTML-разметке; валидатор разъяснит суть ошибок.&lt;br /&gt;
&lt;br /&gt;
Валидный документ должен содержать определение типа документа ([[DTD]]). DTD должен быть расположен до всех других элементов документа. Вот наиболее распространённые типы DTD для XHTML:&lt;br /&gt;
&lt;br /&gt;
* XHTML 1.0 Strict&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* XHTML 1.0 Transitional&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* XHTML 1.0 Frameset&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Frameset//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* XHTML 1.0 Mobile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//WAPFORUM//DTD XHTML Mobile 1.0//EN&amp;quot; &amp;quot;http://www.wapforum.org/DTD/xhtml-mobile10.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* XHTML 1.1&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.1//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Пространство имён (XML)|Пространство имён]] тегов xhtml должно быть обозначено в корневом теге как &amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;lt;ref&amp;gt;[http://www.w3.org/TR/xhtml11/conformance.html#s_conform Conformance Definition] {{Wayback|url=http://www.w3.org/TR/xhtml11/conformance.html#s_conform |date=20081217170011 }}{{ref|en}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Самыми распространёнными ошибками в XHTML-разметке являются:&lt;br /&gt;
* незакрытые элементы (XHTML, в отличие от HTML, требует закрытия всех элементов, в том числе не имеющих закрывающего тега, как, например, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;);&lt;br /&gt;
* отсутствие альтернативных текстов для изображений (достигающихся применением атрибута &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;alt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, который помогает сделать документы доступнее для устройств, которые не в состоянии отображать изображения, или предназначенных для слабовидящих людей);&lt;br /&gt;
* присутствие текста непосредственно в теге &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; документа (должен быть объявлен блочный элемент, внутрь которого следует помещать содержимое);&lt;br /&gt;
* вложение блочных элементов внутрь внутристрочных (inline) (например, блочные элементы &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; не могут быть вложены внутрь инлайновых элементов &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;em&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; и так далее);&lt;br /&gt;
* пренебрежение заключением значений атрибутов в кавычки (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;a href=http://example.com/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://example.com/&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;);&lt;br /&gt;
* неправильное вложение элементов (конструкции вида &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;em&amp;gt; &amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;);&lt;br /&gt;
* неправильное использование [[Мнемоники в HTML|ссылок-мнемоник]] (например, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;amp;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;amp;amp;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;);&lt;br /&gt;
* написание тегов и/или атрибутов [[Прописная буква|прописными буквами]] вместо [[Строчная буква|строчных]] (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;DIV STYLE=&amp;quot;…&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;div style=&amp;quot;...&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;);&lt;br /&gt;
* задание в теге &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;!DOCTYPE …&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; относительного пути к DTD-файлу (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;DTD/xhtml11.dtd&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Этот список не полный и содержит самые частодопускаемые ошибки при составлении XHTML-документов.&lt;br /&gt;
&lt;br /&gt;
Валидный XHTML-документ можно снабжать специальным [[Баннер (интернет)|баннером]] W3C, подтверждающим валидность XHTML-разметки.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Всемирная паутина|Всемирная паутина (WWW)]]&lt;br /&gt;
* [[HTML5]]&lt;br /&gt;
* [[Haml]]&lt;br /&gt;
* [[SGML]]&lt;br /&gt;
*[[CHTML]]&lt;br /&gt;
*[[WML]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Изучаем HTML, XHTML и CSS &lt;br /&gt;
|оригинал = Head First HTML with CSS &amp;amp; XHTML &lt;br /&gt;
|автор = Эрик Фримен, Элизабет Фримен. &lt;br /&gt;
|страниц = 656 &lt;br /&gt;
|isbn = 978-5-459-01060-2 &lt;br /&gt;
|год = 2012&lt;br /&gt;
|место =  СПб.&lt;br /&gt;
|издательство = [[Питер (издательство)|«Питер»]] &lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = HTML, XHTML и CSS для чайников, 7-е издание &lt;br /&gt;
|оригинал = HTML, XHTML &amp;amp; CSS For Dummies, 7th Edition &lt;br /&gt;
|автор = Эд Титтел, Джефф Ноубл. &lt;br /&gt;
|страниц = 400 &lt;br /&gt;
|isbn = 978-5-8459-1752-2 &lt;br /&gt;
|год = 2011&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]] &lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = HTML, XHTML и CSS. Библия пользователя, 5-е издание &lt;br /&gt;
|оригинал = HTML, XHTML, and CSS Bible, 5th Edition &lt;br /&gt;
|автор = Стивен Шафер. &lt;br /&gt;
|страниц = 656 &lt;br /&gt;
|isbn = 978-5-8459-1676-1 &lt;br /&gt;
|год = 2010 &lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = «Диалектика» &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://www.w3.org/MarkUp/ Официальная страница языков разметки на сайте W3C]{{ref|en}}&lt;br /&gt;
* [http://www.w3.org/TR/xhtml1/ XHTML 1.0. Рекомендация W3C.]{{ref|en}}&lt;br /&gt;
* [http://www.w3.org/TR/xhtml11/ XHTML 1.1. Рекомендация W3C.]{{ref|en}}&lt;br /&gt;
* [http://www.w3.org/TR/xhtml-basic/ XHTML Basic 1.1. Рекомендация W3C.]{{ref|en}}&lt;br /&gt;
* [http://www.w3.org/TR/xhtml2/ XHTML 2.0. Отчёт рабочей группы.]{{ref|en}}&lt;br /&gt;
* [http://www.wisdomweb.ru/HTML/xhome.php XHTML учебник с примерами и упражнениями]{{ref|ru}}&lt;br /&gt;
* [http://www.w3.org/2005/11/Translations/Query?titleMatch=XHTML&amp;amp;lang=ru&amp;amp;search1=Submit XHTML Basic. Перевод рекомендации W3C на русский язык.]&lt;br /&gt;
* [https://web.archive.org/web/20080613062855/http://site.nic.ru/content/blogcategory/54/190/ Введение в XHTML]{{ref|ru}}&lt;br /&gt;
* [http://hixie.ch/advocacy/xhtml Sending XHTML as text/html Considered Harmful]{{ref|en}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Валидаторы&#039;&#039;&#039;&lt;br /&gt;
* [http://validator.w3.org/ Онлайн-валидатор HTML, XHTML, MathML, SVG, SMIL]{{ref|en}}&lt;br /&gt;
* [http://tidy.sourceforge.net/ Валидатор-корректор HTML Tidy]{{ref|en}}&lt;br /&gt;
* [http://www.htmlvalidator.com/ CSE HTML Validator]{{ref|en}}&lt;br /&gt;
&lt;br /&gt;
{{Языки разметки документов}}&lt;br /&gt;
{{Стандарты W3C}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:HTML]]&lt;br /&gt;
[[Категория:XML]]&lt;br /&gt;
[[Категория:Приложения обобщённых языков разметки]]&lt;br /&gt;
[[Категория:Стандарты W3C]]&lt;/div&gt;</summary>
		<author><name>31.41.59.210</name></author>
	</entry>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=HTML&amp;diff=6451</id>
		<title>HTML</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=HTML&amp;diff=6451"/>
		<updated>2026-03-22T07:55:39Z</updated>

		<summary type="html">&lt;p&gt;31.41.59.210: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{перевести|en|HTML}}&lt;br /&gt;
{{обновить|дата=2025-07-08}}&lt;br /&gt;
{{Файловый формат&lt;br /&gt;
| name = &lt;br /&gt;
| icon =&lt;br /&gt;
| alt =&lt;br /&gt;
| screenshot = HTML.svg&lt;br /&gt;
| type code = TEXT&lt;br /&gt;
| uniform type = public.html&lt;br /&gt;
| genre = [[Язык разметки]]&lt;br /&gt;
| container for =&lt;br /&gt;
| contained by =&lt;br /&gt;
| extended to = &lt;br /&gt;
| standard = [https://www.w3.org/TR/html52/ W3C HTML 5.2]&amp;lt;br&amp;gt;[https://html.spec.whatwg.org/multipage/ WHATWG HTML Living Standard]&lt;br /&gt;
| url = {{URL|https://www.w3.org/TR/html52/}}&amp;lt;br&amp;gt;{{URL|https://html.spec.whatwg.org/multipage/}}&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;HTML&#039;&#039;&#039;  (от {{lang-en|HyperText Markup Language}} — «язык [[гипертекст]]овой разметки») — стандартизированный язык гипертекстовой разметки документов для просмотра [[Веб-страница|веб-страниц]] в [[Браузер|браузере]]. Веб-браузеры получают HTML документ от сервера по протоколам [[HTTP]]/[[HTTPS]] или открывают с локального диска, далее интерпретируют код в интерфейс, который будет отображаться на экране монитора.&lt;br /&gt;
&lt;br /&gt;
[[Элементы HTML]] являются строительными блоками HTML страниц. С помощью HTML разные конструкции, изображения и другие объекты, такие как [[Форма (HTML)|интерактивная веб-форма]], могут быть встроены в отображаемую страницу. HTML предоставляет средства для создания заголовков, абзацев, списков, ссылок, цитат и других элементов. Элементы HTML выделяются тегами, записанными с использованием угловых скобок. Такие теги, как &amp;lt;code lang=&amp;quot;html5&amp;quot;&amp;gt;&amp;lt;img&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code lang=&amp;quot;html5&amp;quot;&amp;gt;&amp;lt;input&amp;gt;&amp;lt;/code&amp;gt;, напрямую вводят контент на страницу. Другие теги, такие как &amp;lt;code lang=&amp;quot;html5&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, окружают и оформляют текст внутри себя и могут включать другие теги в качестве подэлементов. Браузеры не отображают HTML-теги, но используют их для интерпретации содержимого страницы.&lt;br /&gt;
&lt;br /&gt;
Язык [[XHTML]] является более строгим вариантом HTML, он следует синтаксису [[XML]] и является приложением языка XML в области разметки гипертекста. &lt;br /&gt;
&lt;br /&gt;
В HTML можно встроить язык программирования JavaScript с помощью тега &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;ref name-&amp;quot;v100&amp;quot;&amp;gt;{{cite web |url=https://www.w3schools.com/Tags/tag_script.asp |title=HTML &amp;lt;script&amp;gt; Tag |access-date=2024-12-05 |url-status=live |archive-date=2024-12-08 |archive-url=https://web.archive.org/web/20241208020956/https://www.w3schools.com/Tags/tag_script.asp }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также включение [[CSS]] в HTML позволяет задавать внешний вид и макет страницы.&lt;br /&gt;
&lt;br /&gt;
== Общее представление ==&lt;br /&gt;
Язык [[гипертекст]]овой разметки HTML был разработан британским учёным [[Бернерс-Ли, Тим|Тимом Бернерсом-Ли]] приблизительно в [[1986 год|1986]]—[[1991 год]]ах в стенах [[ЦЕРН]]а в [[Женева|Женеве]] в [[Швейцария|Швейцарии]]&amp;lt;ref&amp;gt;Tim Berners-Lee, «Information Management: A Proposal.» CERN (March 1989, May 1990). [https://www.w3.org/History/1989/proposal.html W3.org] {{Wayback|url=https://www.w3.org/History/1989/proposal.html |date=20100401051011 }}&amp;lt;/ref&amp;gt;. HTML создавался как язык для обмена научной и технической документацией, пригодный для использования людьми, не являющимися специалистами в области [[Вёрстка|вёрстки]]. HTML успешно справлялся с проблемой сложности [[SGML]] путём определения небольшого набора структурных и [[Семантика|семантических]] элементов — дескрипторов. Дескрипторы также часто называют «[[Тег (языки разметки)|тегами]]». С помощью HTML можно легко создать относительно простой, но красиво оформленный документ. Помимо упрощения структуры документа, в HTML внесена поддержка гипертекста. [[Мультимедиа|Мультимедийные]] возможности были добавлены позже.&lt;br /&gt;
&lt;br /&gt;
Первым общедоступным описанием HTML был документ «Теги HTML», впервые упомянутый в Интернете Тимом Бернерсом-Ли в конце 1991 года&amp;lt;ref name=&amp;quot;tagshtml&amp;quot;&amp;gt;{{cite web|url=https://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html|title=Tags used in HTML|publisher=World Wide Web Consortium|date=1992-11-03|access-date=2008-11-16|archive-date=2010-01-31|archive-url=https://web.archive.org/web/20100131184344/http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html|url-status=live}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web |title=First mention of HTML Tags on the www-talk mailing list |url=http://lists.w3.org/Archives/Public/www-talk/1991SepOct/0003.html |publisher=World Wide Web Consortium |date=1991-10-29 |access-date=2007-04-08 |archive-date=2013-05-12 |archive-url=https://www.webcitation.org/6GYgsW0Uz?url=http://lists.w3.org/Archives/Public/www-talk/1991SepOct/0003.html |url-status=live }}&amp;lt;/ref&amp;gt;. В нём описываются 18 элементов, составляющих первоначальный, относительно простой дизайн HTML. За исключением тега гиперссылки, на них сильно повлиял SGMLguid, внутренний формат документации, основанный на стандартном обобщенном языке разметки (SGML), в CERN. Одиннадцать из этих элементов всё ещё существуют в HTML 4&amp;lt;ref&amp;gt;{{cite web|url=https://www.w3.org/TR/1999/REC-html401-19991224/index/elements|title=Index of elements in HTML 4|publisher=World Wide Web Consortium|date=1999-12-24|access-date=2007-04-08|archive-date=2007-05-05|archive-url=https://web.archive.org/web/20070505172415/https://www.w3.org/TR/1999/REC-html401-19991224/index/elements|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Изначально язык HTML был задуман и создан как средство структурирования и форматирования документов без их привязки к средствам воспроизведения (отображения). В идеале, текст с разметкой HTML должен был без стилистических и структурных искажений воспроизводиться на оборудовании с различной технической оснащённостью (цветной экран современного компьютера, монохромный экран органайзера, ограниченный по размерам экран мобильного телефона или устройства и программы голосового воспроизведения текстов). Однако современное применение HTML очень далеко от его изначальной задачи. Например, тег &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;table&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; предназначен для создания в документах таблиц, но иногда используется и для оформления размещения элементов на странице. С течением времени основная идея платформонезависимости языка HTML была принесена в жертву современным потребностям в мультимедийном и графическом оформлении.&lt;br /&gt;
&lt;br /&gt;
== Браузеры ==&lt;br /&gt;
Текстовые документы, содержащие разметку на языке HTML (такие документы традиционно имеют [[Расширение имени файла|расширение]] &amp;lt;code&amp;gt;.html&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;.htm&amp;lt;/code&amp;gt;), обрабатываются специальными [[Прикладное программное обеспечение|приложениями]], которые отображают документ в его форматированном виде. Такие приложения, называемые «браузерами» или «интернет-обозревателями», обычно предоставляют пользователю удобный [[Пользовательский интерфейс|интерфейс]] для запроса [[Веб-страница|веб-страниц]], их просмотра (и вывода на иные внешние устройства) и, при необходимости, отправки введённых пользователем данных на сервер. Наиболее популярными на сегодняшний день браузерами являются [[Google Chrome]], [[Mozilla Firefox]], [[Opera]], [[Internet Explorer]], [[Microsoft Edge]] и [[Safari]] (см.: [[Браузер#Рыночные доли]]).&lt;br /&gt;
&lt;br /&gt;
== Версии ==&lt;br /&gt;
&#039;&#039;См. также [[HTML5]].&#039;&#039;&lt;br /&gt;
* HTML 2.0 — опубликован [[Инженерный совет Интернета|IETF]] как RFC 1866 в статусе &#039;&#039;Proposed Standard&#039;&#039; ([[24 ноября]] [[1995 год]]а)&amp;lt;ref&amp;gt;{{cite web|last=Berners-Lee, Tim; Connelly, Daniel|url=http://tools.ietf.org/html/rfc1866|title=Hypertext Markup Language – 2.0|publisher=Internet Engineering Task Force|date=1995-11|access-date=2010-12-01|archive-date=2011-08-27|archive-url=https://web.archive.org/web/20110827085509/http://tools.ietf.org/html/rfc1866|url-status=live}}&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* HTML 3.0 — 28 марта 1995 года — IETF Internet Draft (до 28 сентября 1995 года);&lt;br /&gt;
* HTML 3.2&amp;lt;ref&amp;gt;{{Cite web |url=http://www.w3.org/TR/REC-html32 |title=HTML 3.2 Reference Specification&amp;lt;!-- Заголовок добавлен ботом --&amp;gt; |access-date=2004-08-18 |archive-date=2010-06-19 |archive-url=https://web.archive.org/web/20100619054311/http://www.w3.org/TR/REC-html32 |url-status=live }}&amp;lt;/ref&amp;gt; — [[14 января]] [[1997 год]]а;&lt;br /&gt;
* HTML 4.0&amp;lt;ref&amp;gt;{{Cite web |url=http://www.w3.org/TR/REC-html40-971218/ |title=HTML 4.0 Specification&amp;lt;!-- Заголовок добавлен ботом --&amp;gt; |access-date=2004-08-18 |archive-date=2011-06-06 |archive-url=https://web.archive.org/web/20110606002650/http://www.w3.org/TR/REC-html40-971218/ |url-status=live }}&amp;lt;/ref&amp;gt; — [[18 декабря]] 1997 года;&lt;br /&gt;
* HTML 4.01&amp;lt;ref&amp;gt;[http://www.w3.org/TR/html401/ Спецификация HTML 4.01] {{Wayback|url=http://www.w3.org/TR/html401/ |date=20050306015517 }}{{ref|en}}&amp;lt;/ref&amp;gt; — [[24 декабря]] [[1999 год]]а;&lt;br /&gt;
* ISO/IEC 15445:2000&amp;lt;ref&amp;gt;[http://www.purl.org/NET/ISO+IEC.15445/15445.html ISO/IEC 15445:2000(E) ISO-HTML&amp;lt;!-- Заголовок добавлен ботом --&amp;gt;]{{Недоступная ссылка}}&amp;lt;/ref&amp;gt; (так называемый ISO HTML, основан на HTML 4.01 Strict) — [[15 мая]] [[2000 год]]а;&lt;br /&gt;
* [[HTML5]]&amp;lt;ref&amp;gt;{{Cite web |url=http://www.w3.org/TR/html50/ |title=HTML5 W3C Recommendation |access-date=2018-01-05 |archive-date=2018-01-06 |archive-url=https://web.archive.org/web/20180106065820/http://www.w3.org/TR/html50/ |url-status=live }}&amp;lt;/ref&amp;gt; — [[28 октября]] [[2014 год]]а&amp;lt;ref&amp;gt;{{Cite web |url=https://www.w3.org/2014/10/html5-rec.html.en |title=Open Web Platform Milestone Achieved with HTML5 Recommendation |access-date=2018-01-05 |archive-date=2014-10-28 |archive-url=https://web.archive.org/web/20141028233921/https://www.w3.org/2014/10/html5-rec.html.en |url-status=live }}&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* HTML 5.1 начал разрабатываться 17 декабря 2012 года&amp;lt;ref&amp;gt;[http://dev.w3.org/html5/decision-policy/html5-2014-plan.html#plan Начало разработки версии 5.1] {{Wayback|url=http://dev.w3.org/html5/decision-policy/html5-2014-plan.html#plan |date=20161225190623 }} [[W3C]]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web |url=http://www.w3.org/TR/2012/WD-html51-20121217/ |title=HTML 5.1 W3C Working Draft 17 December 2012 |access-date=2015-07-02 |archive-date=2015-07-16 |archive-url=https://web.archive.org/web/20150716020352/http://www.w3.org/TR/2012/WD-html51-20121217/ |url-status=live }}&amp;lt;/ref&amp;gt;. Рекомендован к применению с 1 ноября 2016 года&amp;lt;ref&amp;gt;{{Cite web |url=https://www.w3.org/TR/html51/ |title=HTML 5.1 W3C Recommendation |access-date=2016-11-07 |archive-date=2016-11-07 |archive-url=https://web.archive.org/web/20161107021743/https://www.w3.org/TR/html51/ |url-status=live }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web |url=https://www.w3.org/blog/news/archives/5932 |title=HTML 5.1 is a W3C Recommendation {{!}} W3C News |access-date=2018-01-05 |archive-date=2020-11-08 |archive-url=https://web.archive.org/web/20201108103720/https://www.w3.org/blog/news/archives/5932 |url-status=live }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web |url=https://www.w3.org/blog/news/archives/6553 |title=HTML 5.1 2nd Edition is a W3C Recommendation {{!}} W3C News |access-date=2018-01-05 |archive-date=2018-01-06 |archive-url=https://web.archive.org/web/20180106073711/https://www.w3.org/blog/news/archives/6553 |url-status=live }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web |url=https://www.w3.org/blog/2016/11/html-5-1-is-the-gold-standard/ |title=HTML 5.1 is the gold standard {{!}} W3C Blog |access-date=2018-01-05 |archive-date=2020-11-08 |archive-url=https://web.archive.org/web/20201108101419/https://www.w3.org/blog/2016/11/html-5-1-is-the-gold-standard/ |url-status=live }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* HTML 5.2 был представлен 14 декабря 2017 года&amp;lt;ref&amp;gt;{{Cite web |url=https://www.w3.org/TR/html52/ |title=HTML 5.2 W3C Recommendation |access-date=2018-01-05 |archive-date=2017-12-14 |archive-url=https://web.archive.org/web/20171214093104/https://www.w3.org/TR/html52/ |url-status=live }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web |url=https://www.w3.org/blog/news/archives/6696 |title=HTML 5.2 is now a W3C Recommendation {{!}} W3C News |access-date=2018-01-05 |archive-date=2020-11-07 |archive-url=https://web.archive.org/web/20201107052342/https://www.w3.org/blog/news/archives/6696 |url-status=live }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web |url=https://www.w3.org/blog/2017/12/html-5-2-is-done-html-5-3-is-coming/ |title=HTML 5.2 is done, HTML 5.3 is coming {{!}} W3C Blog |access-date=2018-01-05 |archive-date=2020-11-09 |archive-url=https://web.archive.org/web/20201109042116/https://www.w3.org/blog/2017/12/html-5-2-is-done-html-5-3-is-coming/ |url-status=live }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* HTML 5.3 был представлен 24 декабря 2018 года.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Версия 3 была предложена [[W3C|Консорциумом Всемирной паутины]] (W3C) в марте 1995 года и обеспечивала много новых возможностей, таких как создание таблиц, «обтекание» изображений текстом и отображение сложных [[Математическая формула|математических формул]], поддержка [[GIF|gif-формата]]. Даже при том, что этот стандарт был совместим со второй версией, реализация его была сложна для браузеров того времени. Версия 3.1 официально никогда не предлагалась, и следующей версией стандарта HTML стала 3.2, в которой были опущены многие нововведения версии 3.0, но добавлены нестандартные элементы, поддерживаемые браузерами [[Netscape Navigator]] и [[Mosaic]].&lt;br /&gt;
&lt;br /&gt;
В версии HTML 4.0 произошла некоторая «очистка» стандарта. Многие элементы были отмечены как устаревшие и не поддерживаемые ({{lang-en|deprecated}}).&lt;br /&gt;
&lt;br /&gt;
В [[1998 год]]у [[Консорциум Всемирной паутины]] начал работу над новым языком разметки, основанным на HTML 4, но соответствующим синтаксису XML. Впоследствии новый язык получил название [[XHTML]]. Первая версия XHTML 1.0 одобрена в качестве Рекомендации консорциума Всемирной паутины [[26 января]] [[2000 год]]а.&lt;br /&gt;
&lt;br /&gt;
Планируемая версия [[XHTML 2.0]] должна была разорвать совместимость со старыми версиями HTML и XHTML, но 2 июля [[2009 год]]а [[Консорциум Всемирной паутины]] объявил, что полномочия рабочей группы XHTML2 истекают в конце [[2009 год]]а. Таким образом была приостановлена вся дальнейшая разработка стандарта XHTML 2.0&amp;lt;ref&amp;gt;[http://www.w3.org/2009/06/xhtml-faq.html XHTML FAQ] {{Wayback|url=http://www.w3.org/2009/06/xhtml-faq.html |date=20120611034222 }}{{ref|en}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Структура HTML-документа ==&lt;br /&gt;
{{Подробная статья|Элементы HTML}}&lt;br /&gt;
[[File:HTML element content categories.svg|thumb|&amp;lt;!-- HTML element content categories --&amp;gt;]]&lt;br /&gt;
HTML — теговый язык разметки [[HTML-документ|документов]]. Любой документ на языке HTML представляет собой набор [[Элементы HTML|элементов]], причём начало и конец каждого элемента обозначается специальными пометками — &#039;&#039;[[Тег (языки разметки)|тегами]]&#039;&#039;. Элементы могут быть &#039;&#039;пустыми&#039;&#039;, то есть не содержащими никакого текста и других данных. В этом случае обычно не указывается закрывающий тег (например, тег переноса строки &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — одиночный и закрывать его не нужно) . Кроме того, элементы могут иметь &#039;&#039;атрибуты&#039;&#039;, определяющие какие-либо их свойства (например, атрибут &amp;lt;code&amp;gt;href=&amp;quot;&amp;lt;/code&amp;gt; у ссылки). Атрибуты указываются в открывающем теге. Вот примеры фрагментов HTML-документа:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;Текст между двумя тегами — открывающим и закрывающим.&amp;lt;/strong&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://www.example.com&amp;quot;&amp;gt;Здесь элемент содержит атрибут href, то есть гиперссылку.&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;А вот пример пустого элемента: &amp;lt;br&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Регистр, в котором набрано имя элемента и имена атрибутов, в HTML значения не имеет (в отличие от XHTML). Элементы могут быть вложенными. Например, следующий код:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;ru&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
      &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;HTML Document&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&lt;br /&gt;
            Этот текст будет полужирным, &amp;lt;i&amp;gt;а этот — ещё и курсивным&amp;lt;/i&amp;gt;.&lt;br /&gt;
         &amp;lt;/b&amp;gt;&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
даст такой результат:&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Этот текст будет полужирным, &#039;&#039;а этот — ещё и курсивным&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Семантические теги ===&lt;br /&gt;
Рекомендуется использовать семантические теги, например, «&amp;lt;tbody&amp;gt; (семантический тег тела таблицы)» для лучшей индексации браузером.&lt;br /&gt;
&lt;br /&gt;
=== Специальные символы ===&lt;br /&gt;
{{Подробная статья|Википедия:Специальные символы}}&lt;br /&gt;
&lt;br /&gt;
Кроме элементов, в HTML-документах есть и &#039;&#039;сущности&#039;&#039; ({{lang-en|entities)}} — [[Мнемоники в HTML|«специальные символы»]]. Сущности начинаются с символа [[амперсанд]]а и имеют вид &amp;lt;code&amp;gt;&amp;amp;amp;&#039;&#039;имя&#039;&#039;;&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;&amp;amp;amp;#&#039;&#039;NNNN&#039;&#039;;&amp;lt;/code&amp;gt;, где &#039;&#039;NNNN&#039;&#039; — код символа в [[Юникод]]е в десятичной системе счисления.&lt;br /&gt;
&lt;br /&gt;
Например, &amp;lt;code&amp;gt;&amp;amp;amp;copy;&amp;lt;/code&amp;gt; — знак [[Авторское право|авторского права]] (©). Как правило, сущности используются для представления символов, отсутствующих в кодировке документа, или же для представления «специальных» символов: &amp;lt;code&amp;gt;&amp;amp;amp;amp;&amp;lt;/code&amp;gt; — амперсанда (&amp;amp;amp;), &amp;lt;code&amp;gt;&amp;amp;amp;lt;&amp;lt;/code&amp;gt; — символа «меньше» (&amp;amp;lt;) и &amp;lt;code&amp;gt;&amp;amp;amp;gt;&amp;lt;/code&amp;gt; — символа «больше» (&amp;amp;gt;), которые некорректно записывать «обычным» образом из-за их особого значения в HTML.&lt;br /&gt;
&lt;br /&gt;
== Браузерные войны ==&lt;br /&gt;
{{Основная статья|Война браузеров}}&lt;br /&gt;
[[Файл:Usage share of web browsers (Source StatCounter).svg|thumb|Рыночная доля браузеров по данным [[StatCounter]]]]&lt;br /&gt;
В середине [[1990-е годы|1990-х годов]] основные производители браузеров — компании [[Netscape Communications|Netscape]] и [[Microsoft]] — начали внедрять собственные наборы элементов в HTML-разметку. Создалась путаница из различных конструкций для работы во Всемирной паутине, доступных для просмотра то в одном, то в другом браузере. Особенно большие трудности были при создании [[Кроссбраузерность|кросс-браузерных]] программ на языке [[JavaScript]]. [[Веб-мастер]]ам приходилось создавать несколько вариантов страниц или прибегать к другим ухищрениям. На какое-то время проблема потеряла актуальность по двум причинам:&lt;br /&gt;
* Из-за вытеснения браузером [[Internet Explorer]] всех остальных браузеров. Соответственно, проблема веб-мастеров становилась проблемой пользователей альтернативных браузеров.&lt;br /&gt;
* Благодаря усилиям производителей других браузеров, которые либо следовали стандартам [[W3C]] (как [[Mozilla]] и [[Opera]]), либо пытались создать максимальную совместимость с Internet Explorer.&lt;br /&gt;
&lt;br /&gt;
На современном этапе{{каком}} можно констатировать рост популярности браузеров, следующих рекомендациям W3C (это [[Mozilla Firefox]] и другие браузеры на движке [[Gecko]]; [[Safari]], [[Google Chrome]], [[Opera]] и другие браузеры на движке [[WebKit]]). Доля Internet Explorer на июль 2022 года составляет менее 0,28 %&amp;lt;ref&amp;gt;{{Cite web |url=http://gs.statcounter.com/ |title=StatCounter Global Stats — Browser, OS, Search Engine including Mobile Usage Share |access-date=2016-02-23 |archive-date=2012-05-26 |archive-url=https://archive.today/20120526/http://gs.statcounter.com/%23mobile_browser-ww-monthly-201012-201111-bar |url-status=live }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В современной практике{{какой}} существует возможность упростить разработку кросс-браузерных программ на языке JavaScript с помощью различных библиотек и фреймворков, например, таких, как [[jQuery]], [[Scalable Inman Flash Replacement|sIFR]] и др.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[MHTML]] (сокращение для MIME HTML) — архивный формат веб-страниц, используемый для комбинирования кода HTML и ресурсов, которые обычно представлены в виде внешних ссылок, в один файл.&lt;br /&gt;
* [[HTML-цвета]] — это [[Цвет|цвета]], используемые при отображении [[Веб-страница|веб-страниц]], а также методы описания и определения этих цветов.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
{{Родственные проекты|Викисловарь=HTML}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = Изучаем HTML, XHTML и CSS&lt;br /&gt;
|оригинал = Head First HTML with CSS &amp;amp; XHTML&lt;br /&gt;
|автор = Фримен Эрик, Фримен Элизабет&lt;br /&gt;
|страниц = 656&lt;br /&gt;
|isbn = 978-5-49807-113-8&lt;br /&gt;
|год = 2010&lt;br /&gt;
|место =  П.&lt;br /&gt;
|издательство = [[Питер (издательство)|«Питер»]]&lt;br /&gt;
|ответственный=|издание=|страницы=|isbn2=}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = HTML, XHTML и CSS для чайников, 7-е издание&lt;br /&gt;
|оригинал = HTML, XHTML &amp;amp; CSS For Dummies, 7th Edition&lt;br /&gt;
|автор = Эд Титтел, Джефф Ноубл.&lt;br /&gt;
|страниц = 400&lt;br /&gt;
|isbn = 978-5-8459-1752-2&lt;br /&gt;
|год = 2011&lt;br /&gt;
|место = М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = HTML5 для профессионалов: мощные инструменты для разработки современных веб-приложений&lt;br /&gt;
|оригинал = Pro HTML5 Programming: Powerful APIs for Richer Internet Application Development&lt;br /&gt;
|автор = Питер Лабберс, Брайан Олберс, Фрэнк Салим.&lt;br /&gt;
|страниц = 272&lt;br /&gt;
|isbn = 978-5-8459-1715-7&lt;br /&gt;
|год = 2011&lt;br /&gt;
|место = М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|заглавие = HTML, XHTML и CSS. Библия пользователя, 5-е издание&lt;br /&gt;
|оригинал = HTML, XHTML, and CSS Bible, 5th Edition&lt;br /&gt;
|автор = Стивен Шафер.&lt;br /&gt;
|страниц = 656&lt;br /&gt;
|isbn = 978-5-8459-1676-1&lt;br /&gt;
|год = 2010&lt;br /&gt;
|место = М.&lt;br /&gt;
|издательство = [[Диалектика (издательство)|«Диалектика»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Фримен Эрик, Фримен Элизабет.&lt;br /&gt;
|заглавие = Изучаем HTML, XHTML и CSS&lt;br /&gt;
|оригинал = Head First HTML with CSS &amp;amp; XHTML&lt;br /&gt;
|издание = 1-е изд&lt;br /&gt;
|место = М. |издательство = [[Питер (издательство)|«Питер»]]&lt;br /&gt;
|год = 2010&lt;br /&gt;
|страницы = 656&lt;br /&gt;
|isbn = 978-5-49807-113-8&lt;br /&gt;
}}&lt;br /&gt;
* {{книга |автор=Amerland D. |часть= |ссылка часть= |заглавие=Google Semantic Search |оригинал= |ссылка=https://books.google.ru/books?id=niCJxqdc-eoC |викитека= |ответственный= |издание= |место= |издательство=Que Publishing |год=2013 |volume= |pages= |columns= |allpages=240 |серия= |isbn=9780133434170 |тираж= |ref=Amerland }}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{внешние ссылки нежелательны}}&lt;br /&gt;
* [https://html.spec.whatwg.org/multipage/ HTML Standard]&lt;br /&gt;
&lt;br /&gt;
{{Внешние ссылки}}&lt;br /&gt;
{{Языки разметки документов}}&lt;br /&gt;
{{Стандарты W3C}}&lt;br /&gt;
{{Стандарты ISO}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:HTML| ]]&lt;br /&gt;
[[Категория:Стандарты Интернета]]&lt;br /&gt;
[[Категория:Стандарты ISO]]&lt;br /&gt;
[[Категория:Языки разметки]]&lt;br /&gt;
[[К:Приложения обобщённых языков разметки]]&lt;br /&gt;
[[Категория:Стандарты W3C]]&lt;br /&gt;
[[Категория:Гипертекст]]&lt;/div&gt;</summary>
		<author><name>31.41.59.210</name></author>
	</entry>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A4%D0%BE%D1%80%D1%82%D1%80%D0%B0%D0%BD&amp;diff=9624</id>
		<title>Фортран</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A4%D0%BE%D1%80%D1%82%D1%80%D0%B0%D0%BD&amp;diff=9624"/>
		<updated>2026-03-22T07:54:16Z</updated>

		<summary type="html">&lt;p&gt;31.41.59.210: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{не путать|Форт (язык программирования)|Фортом|другим языком программирования}}&lt;br /&gt;
{{Карточка языка программирования&lt;br /&gt;
| name = Фортран&lt;br /&gt;
| logo = &lt;br /&gt;
| semantics = [[Императивное программирование|императивный]], [[Параллелизм (информатика)|параллельный]]&lt;br /&gt;
| paradigm = [[Процедурный язык программирования|процедурный]], [[Модульность (программирование)|модульный]], c элементами [[объектно-ориентированное программирование|объектно-ориентированного]] программирования&lt;br /&gt;
| class = [[Компилятор|компилируемый]]&lt;br /&gt;
| year = 1957&lt;br /&gt;
| designer = [[Бэкус, Джон|Джон Бэкус]], [[IBM]]&lt;br /&gt;
| extension = .for .f .f90 .f95 .ftn&lt;br /&gt;
| latest_release_version = Fortran 2023 (ISO/IEC 1539-1:2023)&lt;br /&gt;
| latest_release_date = 17 ноября 2023&lt;br /&gt;
| latest_preview_version = &lt;br /&gt;
| latest_preview_date = &lt;br /&gt;
| typing = [[Строгая типизация|строгая]], [[статическая типизация|статическая]]&lt;br /&gt;
| implementations = [[GFortran]], [[Open Watcom]], [[Sun Studio]], [[XL Fortran]], [[Intel Fortran Compiler|Intel Fortran]]&lt;br /&gt;
| dialects = [[High Performance Fortran]]&lt;br /&gt;
| influenced_by = &lt;br /&gt;
| influenced = [[ALGOL 68]], [[Бейсик]], [[PL/I]]&lt;br /&gt;
| operating_system = [[Кроссплатформенное программное обеспечение|кроссплатформенный]]&lt;br /&gt;
| license = &lt;br /&gt;
| website = &lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Фортра́н&#039;&#039;&#039; ({{lang-en|Fortran}}, {{IPAc-en|ˈ|f|ɔr|t|r|æ|n}}) — первый [[язык программирования высокого уровня]], получивший практическое применение, имеющий [[транслятор]]&amp;lt;!-- Более ранние разработки трансляторов, впрочем, не намного опередившие команду Дж. Бэкуса (см., например, статью http://www.iis.nsk.su/files/articles/mozaika_lyubimskii_pottosin_shura-bura.pdf), не вышли за пределы академического интереса и не получили практического применения. --&amp;gt; и испытавший дальнейшее развитие&amp;lt;ref&amp;gt;{{Книга|автор=В.Э. Карпов|заглавие=КЛАССИЧЕСКАЯ ТЕОРИЯ КОМПИЛЯТОРОВ|ответственный=|издание=Учебное пособие. 2-е изд.|место=Москва|издательство=|год=2011|страницы=|страниц=91|isbn=5–230–16344–5}}&amp;lt;/ref&amp;gt;. Создан в период с 1954 по 1957 год группой программистов под руководством [[Бэкус, Джон|Джона Бэкуса]] в корпорации [[IBM]]&amp;lt;ref&amp;gt;Язык [[Планкалкюль]], претендующий на пальму первенства, был изобретён ещё в 1945 году, но не был реализован вплоть до 2000 года.&amp;lt;/ref&amp;gt;. Название Fortran является сокращением от &#039;&#039;&#039;FOR&#039;&#039;&#039;mula &#039;&#039;&#039;TRAN&#039;&#039;&#039;slator (формульный транслятор)&amp;lt;ref&amp;gt;Словарь иностранных слов. — М.: «[[Русский язык (издательство)|Русский язык]]», 1989. — 624 с. ISBN 5-200-00408-8&amp;lt;/ref&amp;gt;. Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана — большое количество написанных на нём программ и библиотек подпрограмм&amp;lt;ref&amp;gt;См., например: [http://netlib.org Netlib Repository at UTK and ORNL] {{Wayback|url=http://netlib.org/ |date=20210727103150 }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Имеется большое количество написанных на Фортране (в большей части на старых версиях языка) различных математических библиотек для [[Матрица (математика)|матричной алгебры]] и решения систем [[Линейное уравнение|линейных уравнений]], библиотеки для решения [[дифференциальное уравнение|дифференциальных уравнений]], [[интегральное уравнение|интегральных уравнений]] и их систем, [[Аппроксимация|аппроксимации функций]], [[Специальные функции|специальных функций]], [[Быстрое преобразование Фурье|быстрых преобразований Фурье]], математической статистики и других математических дисциплин. Эти библиотеки поставляются, как правило, с компилятором. Ряд таких пакетов создавался на протяжении десятилетий и популярен в научной среде по сей день, например — [[Международная математическая библиотека подпрограмм]] (IMSL)&amp;lt;ref&amp;gt;{{Cite web |url=http://www.roguewave.com/products-services/imsl-numerical-libraries/fortran-libraries |title=IMSL Fortran Numerical Library {{!}} Rogue Wave&amp;lt;!-- Заголовок добавлен ботом --&amp;gt; |access-date=2015-08-19 |archive-date=2015-08-16 |archive-url=https://web.archive.org/web/20150816131449/http://www.roguewave.com/products-services/imsl-numerical-libraries/fortran-libraries |url-status=live }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Книга|автор=Бартеньев О.В.|часть=1-3|заглавие=Фортран для профессионалов. Математическая библиотека ISML|ответственный=|заглавие2=|издание=|место=Москва|издательство=Диалог-МИФИ|год=2001|том=|страниц=ч1 - 448 с., ч2 - 320 с., ч3 - 368|isbn=5-86404-157-2 (ч.2), 5-86404-18-58-0 (ч.3)|тираж=3000}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны.&lt;br /&gt;
&lt;br /&gt;
Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования, для новых вычислительных архитектур; позволяет применять современные технологии программирования, в частности, [[Обобщённое программирование|обобщённое]] и [[Модульность (программирование)|модульное программирование]], [[объектно-ориентированное программирование|ООП]], сохраняя при этом преемственность с более ранними версиями. Одна из главных концепций развития современного Фортрана — средства поддержки [[Параллельные вычисления|параллельности]] и [[Векторизация (параллельные вычисления)|векторные операции]]&amp;lt;ref name=&amp;quot;ЭволюцГорел&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Эволюция стандартов языка ==&lt;br /&gt;
{| class=&amp;quot;wikitable floatright&amp;quot; style=&amp;quot;margin-left: 1.5em;&amp;quot;&lt;br /&gt;
|+Хронология Фортрана&lt;br /&gt;
|-&lt;br /&gt;
! Год&lt;br /&gt;
! Неформальное название&lt;br /&gt;
! Официальный стандарт&lt;br /&gt;
|-&lt;br /&gt;
| 1957&lt;br /&gt;
| FORTRAN&lt;br /&gt;
| {{n/a}}&lt;br /&gt;
|-&lt;br /&gt;
| 1958&lt;br /&gt;
| FORTRAN II&lt;br /&gt;
| {{n/a}}&lt;br /&gt;
|-&lt;br /&gt;
| 1958&lt;br /&gt;
| FORTRAN III&lt;br /&gt;
| {{n/a}}&lt;br /&gt;
|-&lt;br /&gt;
| 1961&lt;br /&gt;
| FORTRAN IV&lt;br /&gt;
| {{n/a}}&lt;br /&gt;
|-&lt;br /&gt;
| 1966&lt;br /&gt;
| FORTRAN 66&lt;br /&gt;
| ANSI X3.9-1966&lt;br /&gt;
|-&lt;br /&gt;
| 1978&lt;br /&gt;
| FORTRAN 77&lt;br /&gt;
| ANSI X3.9-1978&lt;br /&gt;
|-&lt;br /&gt;
| 1991&lt;br /&gt;
| Fortran 90&lt;br /&gt;
| ANSI X3.198-1992&amp;lt;br /&amp;gt;ISO/IEC 1539:1991&lt;br /&gt;
|-&lt;br /&gt;
| 1997&lt;br /&gt;
| Fortran 95&lt;br /&gt;
| ISO/IEC 1539-1:1997&lt;br /&gt;
|-&lt;br /&gt;
| 2004&lt;br /&gt;
| Fortran 2003&lt;br /&gt;
| ISO/IEC 1539-1:2004&lt;br /&gt;
|-&lt;br /&gt;
| 2010&lt;br /&gt;
| Fortran 2008&lt;br /&gt;
| ISO/IEC 1539-1:2010&lt;br /&gt;
|-&lt;br /&gt;
| 2018&lt;br /&gt;
| Fortran 2018&lt;br /&gt;
| ISO/IEC 1539-1:2018&lt;br /&gt;
|-&lt;br /&gt;
| 2023&lt;br /&gt;
| Fortran 2023&lt;br /&gt;
| ISO/IEC 1539-1:2023&lt;br /&gt;
|}&lt;br /&gt;
Фортран — жёстко стандартизированный язык, поэтому он легко переносится на различные платформы. Новые стандарты языка в значительной мере сохраняют преемственность с более старыми, что позволяет использовать коды ранее написанных программ и модифицировать их&amp;lt;ref name=&amp;quot;ЭволюцГорел&amp;quot;&amp;gt;{{статья|автор=[[Горелик, Алла Моисеевна|Горелик А. М.]]|заглавие=Эволюция языка программирования Фортран (1957—2007) и перспективы его развития|издание=Вычислительные методы и программирование|год=2008|том=9|выпуск=|номер=|страницы=53—71|ссылка=http://num-meth.srcc.msu.ru/zhurnal/tom_2008/v9r208.html|doi=|arxiv=|bibcode=|язык=ru|archive-date=2015-04-02|archive-url=https://web.archive.org/web/20150402162524/http://num-meth.srcc.msu.ru/zhurnal/tom_2008/v9r208.html}}&amp;lt;/ref&amp;gt;. При этом по мере развития языка заранее объявляются устаревшие конструкции, которые в будущем, возможно, будут удалены&amp;lt;ref name=&amp;quot;:1&amp;quot;&amp;gt;{{Книга|автор=Горелик А.М.|часть=Часть 2, Главы 14-20|заглавие=Программирование на современном Фортране|ответственный=|издание=|место=Москва|издательство=Финансы и статистика|год=2006|страницы=|страниц=352|isbn=5-279-03066-X|тираж=3000}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== FORTRAN 66 (1966) ===&lt;br /&gt;
: Стандарт [[ANSI]] X3.9-1966&amp;lt;ref&amp;gt;{{Книга|ссылка=https://wg5-fortran.org/ARCHIVE/Fortran66.pdf|автор=ANSI|заглавие=X3.9-1966 - FORTRAN|год=1966|access-date=2021-02-18|archive-date=2020-11-01|archive-url=https://web.archive.org/web/20201101011422/https://wg5-fortran.org/ARCHIVE/Fortran66.pdf|url-status=live}}&amp;lt;/ref&amp;gt; определил язык FORTRAN (основанный на FORTRAN IV фирмы IBM, который служил стандартом де-факто). Впоследствии на него стали ссылаться как на FORTRAN 66, хотя многие продолжали называть его FORTRAN IV, язык, на котором стандарт был в значительной степени основан.&lt;br /&gt;
[[Файл:Ftn-elim-1240x1709.jpg|thumb|Программа на FORTRAN-77 с выдачей компилятора]]&lt;br /&gt;
&lt;br /&gt;
=== FORTRAN 77 (1978) ===&lt;br /&gt;
: ANSI X3.9-1978, ISO 1539:1980&amp;lt;ref&amp;gt;{{Cite web|lang=en|url=https://wg5-fortran.org/ARCHIVE/Fortran77.html|title=Fortran 77 - ANSI X3J3/90.4 Working Group|access-date=2021-02-18|archive-date=2020-11-11|archive-url=https://web.archive.org/web/20201111174213/https://wg5-fortran.org/ARCHIVE/Fortran77.html|url-status=live}}&amp;lt;/ref&amp;gt;, введено множество улучшений&amp;lt;ref name=&amp;quot;ЭволюцГорел&amp;quot; /&amp;gt;:&lt;br /&gt;
# Введены операторы открытия и закрытия файла (&amp;lt;code&amp;gt;OPEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CLOSE&amp;lt;/code&amp;gt;) и вывода на стандартное устройство — &amp;lt;code&amp;gt;PRINT&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлены строковый тип данных и функции для его обработки.&lt;br /&gt;
# Введён блочный [[Оператор (программирование)|оператор]] &amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt; и конструкция &amp;lt;code&amp;gt;IF THEN&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;ELSE IF THEN&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;END IF&amp;lt;/code&amp;gt;, а также оператор включения фрагмента программы &amp;lt;code&amp;gt;INCLUDE&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Введена возможность работы с файлами прямого доступа.&lt;br /&gt;
# Увеличена максимальная размерность массива с 3 до 7. Сняты ограничения на индексы массива.&lt;br /&gt;
# Усовершенствованы и расширены возможности работы с процедурами.&lt;br /&gt;
# Введено понятие внутреннего файла (каковыми являются массивы, числовые и строковые переменные). Внутренние файлы позволяют, в частности, осуществлять преобразование число-строка и строка-число стандартным операторами чтения и записи &amp;lt;code&amp;gt;READ&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;WRITE&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;БартеньевСФ&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Fortran 90 (1991) ===&lt;br /&gt;
: ISO/IEC 1539:1991 (ANSI INCITS 198—1992)&amp;lt;ref&amp;gt;{{Cite web|lang=en|url=https://wg5-fortran.org/N001-N1100/N692.pdf|title=Fortran 90 - Last Working Draft|website=wg5-fortran.org|access-date=2021-02-18|archive-date=2020-11-05|archive-url=https://web.archive.org/web/20201105092235/https://wg5-fortran.org/N001-N1100/N692.pdf|url-status=live}}&amp;lt;/ref&amp;gt;, значительно переработан стандарт языка&amp;lt;ref name=&amp;quot;БартеньевСФ&amp;quot;&amp;gt;{{книга&lt;br /&gt;
|ссылка = http://lib.mexmat.ru/books/8926&lt;br /&gt;
|автор = Бартеньев О. В.&lt;br /&gt;
|заглавие = Современный Фортран&lt;br /&gt;
|место = М.&lt;br /&gt;
|издательство = Диалог МИФИ&lt;br /&gt;
|год = 2005&lt;br /&gt;
|isbn = 5-86404-113-0&lt;br /&gt;
|archive-date = 2011-02-10&lt;br /&gt;
|archive-url = https://web.archive.org/web/20110210080511/http://lib.mexmat.ru/books/8926&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; включая смену названия FORTRAN на Fortran.&lt;br /&gt;
# Введён свободный формат написания кода. Появились дополнительные описания &amp;lt;code&amp;gt;IMPLICIT NONE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ALLOCATABLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POINTER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TARGET&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NAMELIST&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Введены управляющие операторы и конструкции. Добавлены &amp;lt;code&amp;gt;DO&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;END DO&amp;lt;/code&amp;gt; (вместо завершения цикла меткой), &amp;lt;code&amp;gt;DO WHILE&amp;lt;/code&amp;gt;, оператор передачи управления на начало цикла &amp;lt;code&amp;gt;CYCLE&amp;lt;/code&amp;gt;, конструкция выбора &amp;lt;code&amp;gt;SELECT CASE&amp;lt;/code&amp;gt; (для замены громоздких конструкций &amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt; и операторов &amp;lt;code&amp;gt;GOTO&amp;lt;/code&amp;gt;), а также заключительный оператор программной единицы, модульной или внутренней процедуры &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;ЭволюцГорел&amp;quot; /&amp;gt;.&lt;br /&gt;
# Введён инструментарий указателей и функции для работы с оперативной памятью (по аналогии с языком С).&lt;br /&gt;
# Введены операторы работы с динамической памятью (&amp;lt;code&amp;gt;ALLOCATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DEALLOCATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NULLIFY&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Добавлены программные компоненты &amp;lt;code&amp;gt;MODULE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PRIVATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PUBLIC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CONTAINS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INTERFACE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INTENT&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Введено маскирование присваивания массивов (присваивание при выполнении наложенного на элементы массива логического условия без использования операторов условия), а также работа с сечениями массивов. Введён оператор и конструкция &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; для частичной замены циклов (правая часть оператора присваивания не изменяется). Маскирование присваивания распространяется практически на все операторы, конструкции и функции, оперирующие с массивами.&lt;br /&gt;
# Стандартные операции присваивания, сложения, вычитания, а также деления и умножения на число распространены на массивы и их секции, определяемые сечениями. В этом случае осуществляется поэлементное присваивание.&lt;br /&gt;
# Появились новые встроенные функции, в первую очередь для работы с массивами. Функции для вычислений в массивах: &amp;lt;code&amp;gt;ALL&amp;lt;/code&amp;gt; (логическое произведение) и &amp;lt;code&amp;gt;MASK&amp;lt;/code&amp;gt; (логическое сложение), &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt; (число истинных элементов), &amp;lt;code&amp;gt;PRODUCT&amp;lt;/code&amp;gt;(произведение элементов массива), &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt; (сложение элементов массива), &amp;lt;code&amp;gt;DOT_PRODUCT&amp;lt;/code&amp;gt; (скалярное произведение), &amp;lt;code&amp;gt;MATMUL&amp;lt;/code&amp;gt; (умножение матриц). Добавились справочные функции, а также функции переформирования и свёртки массивов.&lt;br /&gt;
# В языке появились элементы [[объектно-ориентированное программирование|ООП]]&amp;lt;ref name=&amp;quot;ГореликООП&amp;quot;&amp;gt;&#039;&#039;Горелик А. М.&#039;&#039; [http://www.ict.edu.ru/ft/004318/prep2002_70.pdf Объектно-ориентированное программирование на современном Фортране] {{Wayback|url=http://www.ict.edu.ru/ft/004318/prep2002_70.pdf |date=20110907185633 }}&amp;lt;/ref&amp;gt;. Введены производные типы данных. Отдельно объявлен список устаревших черт языка, предназначенных для удаления в будущем.&lt;br /&gt;
# Добавлены дополнительные функции для работы со строковыми данными, в частности, функции &amp;lt;code&amp;gt;TRIM&amp;lt;/code&amp;gt; (удаление завершающих пробелов) и &amp;lt;code&amp;gt;REPEAT&amp;lt;/code&amp;gt; (кратное копирование строки) и функции выравнивания по левой и правой границам.&lt;br /&gt;
&lt;br /&gt;
=== Fortran 95 (1997) ===&lt;br /&gt;
: ISO/IEC 1539-1:1997&amp;lt;ref&amp;gt;{{Cite web|lang=en|url=https://wg5-fortran.org/N1151-N1200/N1191.pdf|title=Fortran 95 - Last Working Draft|website=wg5-fortran.org|access-date=2021-02-18|archive-date=2021-07-01|archive-url=https://web.archive.org/web/20210701060345/https://wg5-fortran.org/N1151-N1200/N1191.pdf|url-status=live}}&amp;lt;/ref&amp;gt;, коррекция предыдущего стандарта. Введён оператор и конструкция &amp;lt;code&amp;gt;FORALL&amp;lt;/code&amp;gt;, позволяющие более гибко, чем оператор и конструкция &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, присваивать массивы и заменять громоздкие циклы. &amp;lt;code&amp;gt;FORALL&amp;lt;/code&amp;gt; позволяет заменить любое присваивание сечений или оператор и конструкцию &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, в частности, обеспечивает доступ к диагонали матрицы. Данный оператор считается перспективным в параллельных вычислениях, способствуя более эффективному, чем циклы, осуществлению распараллеливания&amp;lt;ref&amp;gt;{{Книга|автор=Горелик А. М.|часть=3. Введение в параллельное программирование на Фортране|заглавие=Программирование на современном Фортране|ответственный=|издание=|место=Москва|издательство=Финансы и статистика|год=2006|страницы=|страниц=352|isbn=5-279-03066-X}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;БартеньевСФ&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;Алгазин&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Fortran 2003 (2004) ===&lt;br /&gt;
: Принят как ISO/IEC 1539-1:2004&amp;lt;ref&amp;gt;{{cite web|title=Fortran 2003– Last Working Draft|url=http://www.j3-fortran.org/doc/year/04/04-007.txt|publisher=Gnu.Org|access-date=2014-05-10|archive-date=2021-02-25|archive-url=https://web.archive.org/web/20210225090124/https://j3-fortran.org/doc/year/04/04-007.txt|url-status=live}}&amp;lt;/ref&amp;gt;. Дальнейшее развитие поддержки [[объектно-ориентированное программирование|ООП]] в языке. Взаимодействие с операционной системой. Добавлены также следующие возможности&amp;lt;ref name=&amp;quot;ЭволюцГорел&amp;quot; /&amp;gt;:&lt;br /&gt;
# Асинхронный ввод-вывод данных.&lt;br /&gt;
# Средства взаимодействия с языком &#039;&#039;&#039;[[Си (язык программирования)|C]]&#039;&#039;&#039;.&lt;br /&gt;
# Усовершенствование динамического размещения данных&amp;lt;ref name=&amp;quot;Алгазин&amp;quot;&amp;gt;{{книга&lt;br /&gt;
 |автор         = Алгазин С. Д., Кондратьев В. В.&lt;br /&gt;
 |заглавие      = Программирование на Visual Fortran&lt;br /&gt;
 |место         = М.&lt;br /&gt;
 |издательство  = «Диалог [[Национальный исследовательский ядерный университет «МИФИ»|МИФИ]]»&lt;br /&gt;
 |год           = 2008&lt;br /&gt;
 |страниц       = 448&lt;br /&gt;
 |isbn          = 5-8243-0759-8&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Fortran 2008 (2010) ===&lt;br /&gt;
: ISO/IEC 1539-1:2010, общепринятое неформальное название Fortran 2008&amp;lt;ref&amp;gt;{{cite web|title=Fortran 2008 – Last Working Draft|url=http://www.j3-fortran.org/doc/year/10/10-007.pdf|publisher=Gnu.Org|access-date=2014-05-10|archive-date=2021-03-03|archive-url=https://web.archive.org/web/20210303181414/https://j3-fortran.org/doc/year/10/10-007.pdf|url-status=live}}&amp;lt;/ref&amp;gt;. Стандартом предполагается поддержка средствами языка параллельных вычислений (Co-Arrays Fortran)&amp;lt;ref name=&amp;quot;ЭволюцГорел&amp;quot; /&amp;gt;&amp;lt;ref&amp;gt;Горелик А. М.[http://parallel.ru/tech/tech_dev/f2000.html Новости] {{Wayback|url=http://parallel.ru/tech/tech_dev/f2000.html |date=20120302101235 }}&amp;lt;/ref&amp;gt;. Также предполагается увеличить максимальную размерность массивов до 15, добавить встроенные специальные математические функции&amp;lt;ref name=&amp;quot;ЭволюцГорел&amp;quot; /&amp;gt; и др.&lt;br /&gt;
&lt;br /&gt;
=== Fortran 2018 ===&lt;br /&gt;
: Версия языка Fortran 2018 (ранее известная как Fortran 2015) была выпущена 28 ноября 2018 года&amp;lt;ref name=&amp;quot;F2018&amp;quot;&amp;gt;{{cite web|url=https://wg5-fortran.org/f2018.html|publisher=ISO|title=Fortran 2018|access-date=2018-11-30|archive-date=2017-12-01|archive-url=https://web.archive.org/web/20171201030814/https://wg5-fortran.org/f2018.html|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Fortran 2018 (ISO/IEC 1539-1:2018) включает в себя:&lt;br /&gt;
:* ISO/IEC TS 29113:2012 — Дальнейшая совместимость с C&amp;lt;ref name=&amp;quot;TS29113&amp;quot;&amp;gt;{{cite web|url=https://wg5-fortran.org/N1901-N1950/N1942.pdf|title=Further Interoperability with C|publisher=ISO|access-date=2017-11-20|archive-date=2021-03-08|archive-url=https://web.archive.org/web/20210308132136/https://wg5-fortran.org/N1901-N1950/N1942.pdf|url-status=live}}&amp;lt;/ref&amp;gt;;&lt;br /&gt;
:* ISO/IEC TS 18508:2015 — Дополнительные параллельные функции в Fortran&amp;lt;ref name=&amp;quot;TS18508&amp;quot;&amp;gt;{{cite web|url=http://isotc.iso.org/livelink/livelink?func=ll&amp;amp;objId=17288706&amp;amp;objAction=Open|title=Additional Parallel Features in Fortran|publisher=ISO|access-date=2017-11-20}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
: Также введены поддержка [[IEEE 754|ISO/IEC/IEEE 60559:2011]], шестнадцатеричный ввод/вывод чисел с плавающей точкой, усовершенствования IMPLICIT NONE и другие изменения.&lt;br /&gt;
&lt;br /&gt;
=== Fortran 2023 ===&lt;br /&gt;
: Последняя версия языка Fortran — Fortran 2023 (ISO/IEC 1539-1:2023) была выпущена в ноябре 2023 года&amp;lt;ref&amp;gt;{{cite web |title=Fortran 2023 |url=https://wg5-fortran.org/f2023.html |website=wg5-fortran.org |access-date=2023-11-30}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
:Fortran 2023 — это небольшое расширение Fortran 2018, которое в основном фокусируется на исправлении ошибок и упущений в Fortran 2018. Также добавлены некоторые новые небольшие функции, включая возможности работать с [[Перечисляемый тип|перечислением]].&lt;br /&gt;
&lt;br /&gt;
== Возможности и характерные особенности языка ==&lt;br /&gt;
Фортран имеет большой набор встроенных математических функций, поддерживает работу с целыми, вещественными и комплексными числами двойной и повышенной точности (при бинарных операциях используется &amp;lt;code&amp;gt;real(10)&amp;lt;/code&amp;gt;), имеет богатый инструментарий работы с массивами и внешними файлами. Современный Фортран (2003 и выше) имеет полноценный инструментарий для работы с символьными данными.&lt;br /&gt;
&lt;br /&gt;
Изначально выразительные средства языка были не очень велики, поскольку Фортран был первым реализованным языком высокого уровня. В дальнейшем в Фортран были добавлены многие лексические конструкции, характерные для структурного, модульного, обобщённого и объектно-ориентированного программирования.&lt;br /&gt;
&lt;br /&gt;
=== Формат записи кода ===&lt;br /&gt;
[[Файл:Hollerith card.jpg|thumb|300px|[[Перфокарта]] с разметкой колонок для Фортрана ранних версий.]]&lt;br /&gt;
Структура программ изначально была ориентирована на ввод с [[перфокарта|перфокарт]] и имела ряд удобных именно для этого случая свойств. Так, с 1-й по 5-ю колонку располагалась область меток, 6-я служила для маркировки текста как продолжения предыдущей строки (любым символом, кроме пробела и «0»), а с 7-й по 72-ю располагался собственно текст оператора или комментария. Колонки с 73-й по 80-ю могли служить для нумерации карт (чтобы восстановить случайно рассыпавшуюся колоду) или для краткого комментария, транслятором они игнорировались. Если текст оператора не вписывался в отведённое пространство (с 7-й по 72-ю колонку), в 6-й колонке следующей строки ставился признак продолжения, и затем оператор продолжался на ней. Расположить два или более оператора в одной строке (карте) было нельзя. Когда перфокарты ушли в историю, эти достоинства превратились в серьёзные неудобства.&lt;br /&gt;
&lt;br /&gt;
Именно поэтому к стандарту Фортрана, начиная с Fortran 90, с сохранением фиксированного формата исходного текста, был добавлен &#039;&#039;свободный формат&#039;&#039;, который не регламентирует позиции строки и позволяет записывать более одного оператора на строку. Введение свободного формата и современных способов [[Структурное программирование|структурного программирования]]&amp;lt;ref name=&amp;quot;ЭволюцГорел&amp;quot; /&amp;gt; позволило создавать код, [[удобочитаемость|читаемость]] и ясность которого не уступает коду, созданному при помощи других современных языков программирования, таких как [[Паскаль (язык программирования)|Паскаль]], [[Си (язык программирования)|C]] или [[Java]]. Современные среды разработки позволяют комбинировать форматы: например, расширять длину строки до свободного формата (обычно 132 символа), позволяют записывать несколько операторов в строке, но при этом позволяют также сохранять отступ слева (делать левое поле), характерный для старого фиксированного формата, оставляя тем самым выделенную колонку для меток ошибок и форматов, а также колонку продолжения строки.&lt;br /&gt;
&lt;br /&gt;
Своего рода «визитной карточкой» старого Фортрана является огромное количество меток, которые использовались в операторах безусловного перехода &amp;lt;code&amp;gt;[[GOTO]]&amp;lt;/code&amp;gt;, операторах циклов, в условных операторах и в операторах описания форматного ввода-вывода &amp;lt;code&amp;gt;FORMAT&amp;lt;/code&amp;gt;. Большое количество меток и операторов &amp;lt;code&amp;gt;GOTO&amp;lt;/code&amp;gt; часто делало программы на Фортране трудными для понимания.&lt;br /&gt;
&lt;br /&gt;
Именно этот негативный опыт стал причиной, по которой в ряде современных языков программирования (например, в языке [[Java]]) метки и связанные с ними операторы безусловного перехода сильно видоизменены.&lt;br /&gt;
&lt;br /&gt;
Однако современный Фортран (в основном начиная с версии Fortran’90) избавлен от избытка меток за счёт введения таких операторов, как &amp;lt;code&amp;gt;DO&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;END DO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DO WHILE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SELECT CASE&amp;lt;/code&amp;gt;, конструкции &amp;lt;code&amp;gt;IF THEN&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;ELSEIF THEN&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;END IF&amp;lt;/code&amp;gt; и др. Более того, в современных стандартах языка оставлен лишь классический оператор &amp;lt;code&amp;gt;GOTO&amp;lt;/code&amp;gt;, применяемый во многих языках и поныне. Вычисляемый оператор &amp;lt;code&amp;gt;GOTO&amp;lt;/code&amp;gt;, а также конструкция &amp;lt;code&amp;gt;ENTRY&amp;lt;/code&amp;gt; — множественного входа в процедуры, — были исключены из стандарта, хотя, как правило, продолжают поддерживаться компиляторами.&lt;br /&gt;
&lt;br /&gt;
==== Hello, World! ====&lt;br /&gt;
Фиксированный формат (символами «␣» выделены пробелы в позициях строки с 1 по 6):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
␣␣␣␣␣␣PRINT*, &#039;Hello, World!&#039;&lt;br /&gt;
␣␣␣␣␣␣END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Свободный формат:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
print *, &amp;quot;Hello, World!&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Замечания.&#039;&#039;&#039;&lt;br /&gt;
* Оператор начала главной программы &amp;lt;code&amp;gt;PROGRAM&amp;lt;/code&amp;gt; не является обязательным. Строго говоря, единственный обязательный оператор Фортран-программы — оператор &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Выбор прописных или строчных букв для написания операторов программы произволен. С точки зрения современных стандартов языка Фортран, множество прописных букв и множество строчных букв совпадают.&lt;br /&gt;
&lt;br /&gt;
=== Типы данных ===&lt;br /&gt;
Фортран поддерживает 5 основных элементарных встроенных типов данных: &#039;&#039;действительный (&amp;lt;code&amp;gt;REAL&amp;lt;/code&amp;gt;)&#039;&#039;, &#039;&#039;комплексный (&amp;lt;code&amp;gt;COMPLEX&amp;lt;/code&amp;gt;)&#039;&#039;, &#039;&#039;целый (&amp;lt;code&amp;gt;INTEGER&amp;lt;/code&amp;gt;)&#039;&#039; со знаком или без, &#039;&#039;логический (&amp;lt;code&amp;gt;LOGICAL&amp;lt;/code&amp;gt;)&#039;&#039; и &#039;&#039;символьный (&amp;lt;code&amp;gt;CHARACTER&amp;lt;/code&amp;gt;)&#039;&#039;. Кроме того, возможно создавать производные типы данных с помощью ключевого слова &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;. С самого начала создания языка существовали 4 типа данных: действительный, комплексный, целый и логический.&lt;br /&gt;
&lt;br /&gt;
Существует понятие &#039;&#039;разновидности типа данных&#039;&#039; или &#039;&#039;параметры типа.&#039;&#039; Это позволяет параметризовать вещественные и комплексные данные (то есть указывать точность и диапазон десятичного порядка) и другие данные, повышая мобильность приложений.&lt;br /&gt;
&lt;br /&gt;
Для всех числовых данных определены обычные арифметические операции и присваивания, существуют встроенные функции. Встроенная функция &amp;lt;code&amp;gt;Log(&#039;&#039;x&#039;&#039;)&amp;lt;/code&amp;gt; в качестве аргумента &amp;lt;code&amp;gt;&#039;&#039;x&#039;&#039;&amp;lt;/code&amp;gt; может иметь только &#039;&#039;действительное&#039;&#039; или &#039;&#039;комплексное&#039;&#039; число (&#039;&#039;не целое&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Как правило, для действительных чисел «одинарной» точности отводится 4 байта (&amp;lt;code&amp;gt;REAL(4)&amp;lt;/code&amp;gt;, или параметр разновидности типа &amp;lt;code&amp;gt;KIND=4&amp;lt;/code&amp;gt;), «двойной» — 8 байт. Для комплексных чисел число байт удваивается.&lt;br /&gt;
&lt;br /&gt;
Целые числа могут занимать от 1 до 4 байт. Современные компиляторы позволяют программисту оперировать числами и «учетверённой» точности.&lt;br /&gt;
&lt;br /&gt;
В арифметических операциях изменение типа производится по умолчанию от целого в действительное и далее комплексное число, либо применением специальной встроенной числовой функции. Так, эквивалентны следующие выражения (&#039;&#039;i&#039;&#039; — целое): &amp;lt;code&amp;gt;Log(&#039;&#039;i*&#039;&#039;1&#039;&#039;.&#039;&#039;)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Log(real(&#039;&#039;i&#039;&#039;))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Строковые (символьные) данные&#039;&#039; задаются с указанием длины в скобках либо после атрибута типа, либо после имени строки. Для задания строки в теле программы используются одинарные или двойные кавычки. Так, эквивалентны записи: &#039;&#039;A=&#039;It is hot&#039;&#039;&#039; или &#039;&#039;A=&amp;quot;It is hot&amp;quot;&#039;&#039;. Это удобно в тех случаях, когда в самой строке присутствуют кавычки: &#039;&#039;B=&amp;quot;It isn’t hot&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Для строк существует встроенная операция конкатенации (сложения) строк: &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;. Существует 17 специализированных встроенных функций для символьных данных (помимо универсальных, обрабатывающих все типы данных).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метки&#039;&#039; — это целые числа с числом цифр не более 5; символы не допускаются. Метки используются в операторах &amp;lt;code&amp;gt;GO TO&amp;lt;/code&amp;gt;, операторах чтения, записи и форматирования, а также при обработке ошибок и исключений. Помимо меток, в Фортране имеется возможность &#039;&#039;именовать&#039;&#039; управляющие конструкции (циклы, логические условия, конструкции &amp;lt;code&amp;gt;FORALL&amp;lt;/code&amp;gt;… &amp;lt;code&amp;gt;END FORALL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;… &amp;lt;code&amp;gt;END WHERE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SELECT CASE&amp;lt;/code&amp;gt;… &amp;lt;code&amp;gt;END SELECT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;… &amp;lt;code&amp;gt;END TYPE&amp;lt;/code&amp;gt; и др.), причём имя конструкции может содержать любые допустимые в именах переменных символы.&lt;br /&gt;
&lt;br /&gt;
==== Встроенные функции для символьных данных ====&lt;br /&gt;
Для преобразования &#039;&#039;число-символ&#039;&#039;: &amp;lt;code&amp;gt;CHAR(i)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;ACHAR(i)&amp;lt;/code&amp;gt;. Преобразуют целое в соответствующий ему символ операционной системы или символ таблицы [[ASCII]].&lt;br /&gt;
&lt;br /&gt;
Для преобразования &#039;&#039;символ-число&#039;&#039;: &amp;lt;code&amp;gt;ICHAR(i)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;IACHAR(i)&amp;lt;/code&amp;gt;. Осуществляют обратные преобразования.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Функции сравнения строк&#039;&#039;: &amp;lt;code&amp;gt;LGE(A,B)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LGT(A,B)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LLE(A,B)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;LLT(A,B)&amp;lt;/code&amp;gt;. Результат функций — «истина», если длины строк (&#039;&#039;L(A)&#039;&#039; и &#039;&#039;L(B)&#039;&#039;), выраженные в символах ASCII, удовлетворяют следующим неравенствам соответственно: &#039;&#039;L(A)&amp;lt;math&amp;gt;\geqslant&amp;lt;/math&amp;gt;L(B), L(A)&amp;lt;math&amp;gt;&amp;gt;&amp;lt;/math&amp;gt;L(B), L(A)&amp;lt;math&amp;gt;\leqslant&amp;lt;/math&amp;gt;L(B)&#039;&#039; и &#039;&#039;L(A)&amp;lt;math&amp;gt;&amp;lt;&amp;lt;/math&amp;gt;L(B)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Функции длины&#039;&#039;: &amp;lt;code&amp;gt;LEN(A)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;LEN_TRIM(A)&amp;lt;/code&amp;gt;. Первая возвращает длину строки &#039;&#039;А&#039;&#039; (количество символов), вторая — возвращает длину строки без завершающих пробелов, если они имеются.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Функции преобразования&#039;&#039;: &amp;lt;code&amp;gt;TRIM(A)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADJUSTL(A)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;ADJUSTR(A)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REPEAT(A,N)&amp;lt;/code&amp;gt;. Функция &amp;lt;code&amp;gt;TRIM(A)&amp;lt;/code&amp;gt; возвращает строку &#039;&#039;A&#039;&#039; без завершающих пробелов. Функции &amp;lt;code&amp;gt;ADJUSTL(A)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;ADJUSTR(A)&amp;lt;/code&amp;gt; выравнивают строку (удаляют пробелы) слева и справа соответственно. Функция &amp;lt;code&amp;gt;REPEAT(A,N)&amp;lt;/code&amp;gt; возвращает &#039;&#039;N&#039;&#039; копий строки &#039;&#039;А&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Функции поиска в строке:&#039;&#039; &amp;lt;code&amp;gt;SCAN(A,B,[&#039;&#039;back&#039;&#039;])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INDEX(A,B,[&#039;&#039;back&#039;&#039;])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;VERIFY(A,B,[&#039;&#039;back&#039;&#039;])&amp;lt;/code&amp;gt;. Факультативный параметр &#039;&#039;back&#039;&#039; определяет направление поиска: по умолчанию слева (для &amp;lt;code&amp;gt;&#039;&#039;back=.false.&#039;&#039;&amp;lt;/code&amp;gt;) направо (для &amp;lt;code&amp;gt;&#039;&#039;back=.true.&#039;&#039;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;code&amp;gt;SCAN&amp;lt;/code&amp;gt; определяет номер позиции в строке &#039;&#039;A&#039;&#039; (слева или справа) первого найденного символа из списка-строки &#039;&#039;В&#039;&#039;. Если результат отрицательный, то функция возвратит целочисленный 0. Функция &amp;lt;code&amp;gt;INDEX&amp;lt;/code&amp;gt; определяет номер позиции, с которой впервые начинается &#039;&#039;полное&#039;&#039; вхождение строки &#039;&#039;В&#039;&#039; в строку &#039;&#039;А&#039;&#039;. Причём поиск может вестись как слева, так и справа, но номер позиции исчисляется всегда &#039;&#039;слева,&#039;&#039; от начала строки. При неудачном поиске функция возвратит 0. Функция &amp;lt;code&amp;gt;VERIFY&amp;lt;/code&amp;gt; &#039;&#039;обратна&#039;&#039; функции &amp;lt;code&amp;gt;INDEX&amp;lt;/code&amp;gt;. Так, &amp;lt;code&amp;gt;VERIFY&amp;lt;/code&amp;gt; возвращает номер позиции такого символа строки &#039;&#039;A&#039;&#039;, которого &#039;&#039;нет&#039;&#039; в строке-маске &#039;&#039;В&#039;&#039;. Если же &#039;&#039;все&#039;&#039; (различные) символы строки А &#039;&#039;присутствуют&#039;&#039; в строке-маске В, то функция вернёт 0.&lt;br /&gt;
&lt;br /&gt;
Все эти функции являются элементными и их аргументом может быть массив символов или целых чисел. Результатом будет согласованный численный, символьный или логический массив.&lt;br /&gt;
&lt;br /&gt;
Стандарты Фортрана, начиная с версии 2003, предусматривают возможность работы с символами [[Юникод]]а.&lt;br /&gt;
&lt;br /&gt;
Помимо указанных возможностей, Фортран позволяет обрабатывать символьные данные средствами своего встроенного [[Фортран#Работа с массивами|матричного (векторного) анализа]], что существенно повышает гибкость обработки символьных данных.&lt;br /&gt;
&lt;br /&gt;
В Фортране для совместимости с программами, написанными на языке Си, существует понятие &#039;&#039;Си-строки&#039;&#039;, которая задаётся добавлением символа &#039;&#039;с&#039;&#039; после кавычки: &#039;&#039;А=&#039;Это Си-строка’с&#039;&#039;. Нулевая строка будет задана так: &#039;&#039;А=&#039;\0’c&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Подпрограммы (процедуры и функции) ===&lt;br /&gt;
Подпрограммы в Фортране существовали с самого первого стандарта и поныне являются одним из главных инструментов программирования&amp;lt;ref name=&amp;quot;ЭволюцГорел&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В Фортране вызов подпрограмм, функций и передача их параметров происходят исключительно [[вызов по ссылке|по ссылке]] (а не [[вызов по значению|по значению]]). Поэтому подпрограмма может изменить переданный ей аргумент в главной программе, если специальным образом это не предотвратить. Такой механизм позволяет сделать естественной нотацию при записи математических формул и сохранить при этом высокое быстродействие при работе с большими массивами данных&amp;lt;ref&amp;gt;{{Книга|автор = Трой Дуглас, Douglas A. Troy. пер. с англ. Б. А. Кузьмина|заглавие = Программирование на языке Си для персонального компьютера IBM PC|ответственный = И. В. Емелин|издание = |место = Москва|издательство = &amp;quot;Радио и связь&amp;quot;|год = 1991|страницы = |страниц = 432|isbn = 5-256-00707-6, 0-316-85311-9|оригинал = Complete C Language Programming for the IBM-PC}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпрограммы Фортрана могут содержать в списке параметров (называемых формальными параметрами) и необязательные (опциональные) параметры, а могут вообще не содержать параметров.&lt;br /&gt;
&lt;br /&gt;
Стандарт языка позволяет осуществлять [[Перегрузка процедур и функций|перегрузку процедур и операций]] посредством родового интерфейса, объединяя различные процедуры (оперирующая каждая, например, целыми, действительными, комплексными числами и символьными переменными) под одним (родовым) именем. В этом случае в главной программе достаточно обратиться к родовой процедуре, а характер выполняемых операций будет зависеть от типа данных, предложенных процедуре для обработки. По такому принципу сделаны все встроенные функции и подпрограммы, например, &amp;lt;code&amp;gt;COS(x)&amp;lt;/code&amp;gt;. Перегрузка процедур, функций и операторов (причём символы перегруженных операторов программист может предложить свои, помимо встроенных) распространяется не только на встроенные типы данных, но и на типы, определённые программистом&amp;lt;ref name=&amp;quot;БартеньевСФ&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Виды подпрограмм ====&lt;br /&gt;
Процедуры разделяются на &#039;&#039;подпрограммы&#039;&#039; и &#039;&#039;функции&#039;&#039;. Подпрограммы удобнее, если необходимо возвратить большое число разнородных результатов; функции — при возвращении результата одного типа (в том числе массива).&lt;br /&gt;
&lt;br /&gt;
Подпрограмма определяется оператором описания &amp;lt;code&amp;gt;Subroutine&amp;lt;/code&amp;gt; &#039;&#039;имя_подпрограммы (список формальных аргументов)&#039;&#039;, функция — оператором &amp;lt;code&amp;gt;Function&amp;lt;/code&amp;gt; &#039;&#039;имя_функции (список формальных аргументов)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Вызов подпрограммы осуществляется оператором &amp;lt;code&amp;gt;Call&amp;lt;/code&amp;gt; &#039;&#039;имя_подпрограммы (список фактических аргументов)&#039;&#039;. Вызов функции осуществляется по имени с указанием списка фактических аргументов и без использования какого-либо специального оператора.&lt;br /&gt;
&lt;br /&gt;
Начиная со стандарта F’90 поддерживаются &#039;&#039;рекурсивные&#039;&#039; процедуры (отсутствовавшие в ранних версиях из-за ограниченной машинной памяти), для объявления которых необходим явный спецификатор &amp;lt;code&amp;gt;recursive&amp;lt;/code&amp;gt;. При этом результат функции должен отличаться от имени самой функции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Чистые процедуры и функции&#039;&#039; (&amp;lt;code&amp;gt;pure subroutine [function]&amp;lt;/code&amp;gt;) — введённые стандартом F’95 процедуры и функции, не имеющие побочных эффектов. Чистая функция должна возвращать значение и не должна изменять ни одного из своих входных параметров и/или глобальных данных; чистая процедура должна изменять только те параметры, которые явно указаны как результирующие (выходные) посредством атрибута &amp;lt;code&amp;gt;intent(out&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;inout)&amp;lt;/code&amp;gt;). Возможность побочных эффектов в Фортране (то есть, в конечном итоге, возможность изменения переменных в главной программе через подпрограмму) — побочное следствие быстрого метода передачи по адресу.&lt;br /&gt;
&lt;br /&gt;
Чистые программные единицы не могут содержать операторов В/В (&amp;lt;code&amp;gt;WRITE&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;READ&amp;lt;/code&amp;gt;) во внешние файлы и устройства, включая клавиатуру и экран, а также операторов паузы и останова программы.&lt;br /&gt;
&lt;br /&gt;
Все встроенные функции и подпрограммы Фортрана, в том числе математические (кроме обращающихся к операционной системе, функций даты и времени, а также датчиков случайных чисел) являются чистыми, то есть не создают побочных эффектов. Чистые функции введены с целью повышения культуры программирования и повышения эффективности распараллеливания алгоритмов&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;{{Книга|автор=Горелик А.М.|часть=Часть 1, Главы 1-13|заглавие=Программирование на современном Фортране|ответственный=|издание=1|место=Москва|издательство=Финансы и статистика|год=2006|страницы=|страниц=352|isbn=5-279-03066-X}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;:1&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Аргументы подпрограмм ====&lt;br /&gt;
В качестве аргументов подпрограмм могут быть любые встроенные типы данных, включая массивы и их секции, указатели, а также типы, определяемые программистом. Аргументами подпрограмм также могут быть функции и другие подпрограммы, кроме внутренних подпрограмм, операторной функции, родовых (обобщённых) процедур (допускаются только специфические имена) и некоторых др. встроенных типов.&lt;br /&gt;
&lt;br /&gt;
Аргументы подразделяются на &#039;&#039;формальные&#039;&#039; и &#039;&#039;фактические&#039;&#039;. Аргументы заключаются в скобки после имени подпрограммы и разделяются запятыми. Имена фактических и формальных аргументов могут совпадать.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Формальные аргументы&#039;&#039; — это аргументы подпрограммы (функции), указанные при её описании. При отсутствии аргументов у подпрограммы, скобки могут быть опущены. У функции скобки расставляются и при отсутствии формальных аргументов. Формальный параметр-процедура называется &#039;&#039;формальной процедурой&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Фактические аргументы&#039;&#039; — это аргументы, передаваемые подпрограмме или функции для выполнения при её вызове. Функция без аргументов вызывается с пустым списком в скобках, подпрограмма — без скобок.&lt;br /&gt;
&lt;br /&gt;
Формальные и фактические аргументы должны быть &#039;&#039;согласованы&#039;&#039;. Типы аргументов и разновидности их вида должны быть одинаковыми, массиву должен соответствовать массив (или сечение массива) той же конфигурации.&lt;br /&gt;
&lt;br /&gt;
Существуют массивы, &#039;&#039;перенимающие конфигурацию&#039;&#039; и &#039;&#039;перенимающие размер&#039;&#039; как формальные аргументы процедур. &#039;&#039;Массив, перенимающий конфигурацию&#039;&#039; — это формальный аргумент-массив, который наследует конфигурацию соответствующего ему фактического массива. У такого массива при его объявлении задаётся размерность (совпадающая с размерностью фактического аргумента-массива) и опускаются верхние границы. По умолчанию нижние границы равны 1, но могут быть заданы произвольными. Число и значение элементов массива, перенимающего конфигурацию, точно наследуются от фактического аргумента-массива. &#039;&#039;Массив, перенимающий размер&#039;&#039; — это оставленный для совместимости более ранний, свойственный языку Fortran’77, способ описания наследующих массивов. У таких массивов наследуется только последнее измерение, верхняя граница которого описывается звёздочкой (&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;). При этом формальный и фактический массивы-аргументы могут иметь разную размерность. Массивы, перенимающие конфигурацию и размер, не могут быть динамическими или быть указателями. Процедуры, имеющие наследующие массивы, должны иметь явный интерфейс.&lt;br /&gt;
&lt;br /&gt;
Строки-формальные аргументы также могут наследовать (перенимать) длину у соответствующего фактического аргумента-строки. &#039;&#039;Строки, перенимающие длину&#039;&#039;, описываются посредством символа &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;Character (Len = *)&amp;lt;/code&amp;gt; &#039;&#039;имя_строки&#039;&#039;. При явном задании длины строки, длина строки-формального аргумента не может быть больше соответствующего фактического аргумента-строки.&lt;br /&gt;
&lt;br /&gt;
Аргументы бывают &#039;&#039;позиционными&#039;&#039; и &#039;&#039;ключевыми&#039;&#039;. &#039;&#039;Позиционные&#039;&#039; формальные и фактические аргументы связываются друг с другом по порядку их расположения в списке аргументов, который должен совпадать. &#039;&#039;Ключевые&#039;&#039; — по имени ключа, который совпадает с именем формального аргумента. Ключевые позволяют нарушить порядок следования аргументов или пропустить часть из них. Так, для подпрограммы с заголовком &amp;lt;code&amp;gt;Subroutine&amp;lt;/code&amp;gt; ONE (A, B, C, D) вызов может быть таким: &amp;lt;code&amp;gt;Call&amp;lt;/code&amp;gt; ONE (D=&#039;&#039;Z&#039;&#039;, C=&#039;&#039;Y&#039;&#039;, B=&#039;&#039;X&#039;&#039;, A=&#039;&#039;W&#039;&#039;), где &#039;&#039;W, X, Y, Z&#039;&#039; — фактические аргументы.&lt;br /&gt;
&lt;br /&gt;
Ключевые аргументы позволяют иметь &#039;&#039;необязательные аргументы&#039;&#039;, которые могут быть опущены. В этом случае необязательные аргументы должны иметь атрибут &amp;lt;code&amp;gt;Optional&amp;lt;/code&amp;gt;. Например, если задано &amp;lt;code&amp;gt;Optional&amp;lt;/code&amp;gt; &#039;&#039;C, D&#039;&#039;, то в этом случае возможен вызов &amp;lt;code&amp;gt;Call&amp;lt;/code&amp;gt; ONE (B=&#039;&#039;X&#039;&#039;, A=&#039;&#039;W&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Процедуры с необязательными параметрами должны иметь явный интерфейс.&lt;br /&gt;
&lt;br /&gt;
=== Работа с массивами ===&lt;br /&gt;
Массивы — центральный пункт философии Фортрана. Все конструкции языка, данные, программные единицы, операторы, встроенные функции, циклы созданы и создаются для эффективной обработки прежде всего массивов. Фортран по мере своего развития следует принципу максимального, насколько это возможно, ухода от детального (поэлементного) описания и обработки массивов. Особенно это эффективно при обработке многомерных массивов (предельная размерность массивов стандарта F2008 — 15).&lt;br /&gt;
Такой взгляд на массивы не был свойственен ранним версиям языка; первые элементы обобщённого подхода к массивам появились в FORTRAN77; развиваются они и поныне.&lt;br /&gt;
&lt;br /&gt;
Массивы бывают &#039;&#039;статическими&#039;&#039; и &#039;&#039;динамическими&#039;&#039;. Динамические разделяются на &#039;&#039;размещаемые&#039;&#039; и &#039;&#039;автоматические&#039;&#039; (образуемые при вызове подпрограммы). Элементы двумерного массива в Фортране размещаются &#039;&#039;по столбцам&#039;&#039;, а не по строкам, как, например, в [[Си (язык программирования)|Си]]. Таким образом, быстрее всего изменяется первый индекс массива. Поэтому для эффективной работы с массивами во вложенных циклах следует индексировать внутренние циклы левыми индексами, а внешние — правыми. По умолчанию присваивание, ввод, вывод и инициализация массивов осуществляются по столбцам.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
do k=1,10&lt;br /&gt;
 do j=1,20&lt;br /&gt;
  do i=1,100&lt;br /&gt;
arr(i,j,k)=25 ! правильно&lt;br /&gt;
brr(k,j,i)=0  ! работоспособно, но медленнее в несколько раз&lt;br /&gt;
&lt;br /&gt;
end do; end do; end do&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Массивы могут быть нулевого размера (в том числе, если нижняя граница превосходит верхнюю). Индексами границ массивов могут быть любые целые числа. По умолчанию нижняя граница равна 1.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Real, allocatable::  ArR(:,:,:)  ! объявление размещаемого динамического действительного массива &lt;br /&gt;
Integer, allocatable:: ArI(:), ArSI(2,5)  ! целых динамического и статического массивов&lt;br /&gt;
Character(32), allocatable:: ArC(:), ArC2(20) ! динамического массива строк длиной 32 символа и статического массива строк&lt;br /&gt;
&lt;br /&gt;
Allocate(ArR(-74:0,8,1:3), ArI(0), ArC(1:-1))  ! размещение динамических массивов&lt;br /&gt;
print *, size(ArR), size(ArI), size(ArC), size(ArSI)    ! 1800    0    0    10&lt;br /&gt;
&lt;br /&gt;
ArC2(17)(5:27)=&#039;Это присваивание строки&#039; ! В строку номер 17 будет записано ␣ ␣ ␣ ␣ Это␣ присваивание␣ строки␣ ␣ ␣ ␣ ␣&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Сечения массивов, операторы &amp;lt;code&amp;gt;FORALL&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Фортран позволяет эффективно присваивать массивы без циклов посредством &#039;&#039;маскирования присваивания&#039;&#039; с помощью операторов &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;FORALL&amp;lt;/code&amp;gt;, а также &#039;&#039;сечений массивов&#039;&#039; и &#039;&#039;векторных индексов&#039;&#039;. Во всех случаях первоначально вычисляется правая часть выражения целиком (для всех индексов массива) и лишь затем выполняется присваивание для индексов, удовлетворяющих массиву-маске. Вычисления с помощью этих инструментов позволяют повышать быстродействие и облегчают компилятору работу по выделению участков программы, которые могут быть выполнены независимо, то есть распараллелены.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Real:: arr(I1:I2,J1:J2,K1:K2), arr1(I1:I2,J1:J2,K1:K2), arr2(I1:I2,J1:J2,K1:K2)&lt;br /&gt;
Real:: frr(100), frr1(10)/1,2,3,3*4,4*5/&lt;br /&gt;
                ! или&lt;br /&gt;
Real:: frr1(10)=(/1,2,3,4,4,4,5,5,5,5/)&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
arr=1.  ! присваивание массива (встроенная перегрузка для оператора присваивания)&lt;br /&gt;
arr1=Sin(arr)+arr ! элементная функция sin применяется к каждому элементу массива&lt;br /&gt;
&lt;br /&gt;
arr2(I1:I2:1,J1:J2:2,K2:K1:-4)=arr1(I1:I2:1,J1:J2:2,K2:K1:-4) ! присваивание элементов с шагом 1, 2 и -4 (назад), заданное индексным триплетом&lt;br /&gt;
&lt;br /&gt;
frr=(/(J, J=1,100)/) ! присваивание одномерного массива посредством циклического списка&lt;br /&gt;
&lt;br /&gt;
Forall(i=I1:I2, j=J1:J2, k=K1:K2, arr(i,j,k)&amp;gt;0.)  brr(i,j,k)=Log(arr(i,j,k))  ! замена циклов и условных операторов и конструкций. Маскирование присваивания (маска — arr(i,j,k)&amp;gt;0.)&lt;br /&gt;
&lt;br /&gt;
Forall(i=1:N, j=1:N, k=1:N) crr(i,j,k)=Sin(0.5*(i+j)-k)    ! расширение возможностей сечений&lt;br /&gt;
&lt;br /&gt;
Forall(i=1:100) ! конструкция Forall для нескольких операторов присваивания&lt;br /&gt;
 drr(i,i)=0.    ! доступ к диагонали матрицы&lt;br /&gt;
 err(i,i,i)=1.  ! и диагонали трёхмерного массива&lt;br /&gt;
End Forall&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возможны менее очевидные операции:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Integer V(-2:2,1:5)&lt;br /&gt;
&lt;br /&gt;
V=reshape(source=(/(i, i=1,25)/), shape=(/5,5/)) ! инициализация массива порядковыми номерами с помощью конструктора массива и функции переформирования   &lt;br /&gt;
	print *, V   ! Вывод в DOS-окно будет произведён по строкам        &lt;br /&gt;
! 1           2           3           4           5 — 1-й столбец&lt;br /&gt;
! 6           7           8           9          10 — 2-й &lt;br /&gt;
! 11          12         13          14          15 — 3-й&lt;br /&gt;
! 16          17         18          19          20 — 4-й&lt;br /&gt;
! 21          22         23          24          25 — 5-й&lt;br /&gt;
&lt;br /&gt;
V(2,3:4)=V(-1:0,1) ! Повернуть кусочек массива&lt;br /&gt;
	print *, V   ! Вывод в DOS-окно будет произведён по строкам&lt;br /&gt;
! 1           2           3           4           5&lt;br /&gt;
! 6           7           8           9          10&lt;br /&gt;
! 11          12         13          14          2      замена в 3-м столбце 15 на 2 &lt;br /&gt;
! 16          17         18          19          3      замена в 4-м  столбце 20 на 3&lt;br /&gt;
! 21          22         23          24          25&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возможности оператора и конструкции &amp;lt;code&amp;gt;FORALL&amp;lt;/code&amp;gt;, введённого стандартом F’95, шире возможностей оператора и конструкции &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, однако последний в некоторых случаях логического ветвления позволяет упростить код ввиду наличия альтернативы &amp;lt;code&amp;gt;ELSEWHERE&amp;lt;/code&amp;gt;, избегая вложенных условных операторов и сложносоставленных массивов-масок.&lt;br /&gt;
&lt;br /&gt;
Оператор и конструкция &amp;lt;code&amp;gt;FORALL&amp;lt;/code&amp;gt; допускает использование только [[Фортран#Подпрограммы|чистых процедур и функций]]. При маскировании присваивания в операторах &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FORALL&amp;lt;/code&amp;gt;, а также в специальных встроенных функциях для массивов (например, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;) логический массив-маска вычисляется до присваивания и позволяет заменять циклы с логическими условиями внутри них, что позволяет избежать дополнительной работы для [[Предсказатель переходов|предсказателя переходов]] микропроцессора.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Векторный индекс&#039;&#039; — целочисленный одномерный массив, значения которого — индексы некоторого другого массива. Векторные индексы используются для создания произвольных сечений многомерных массивов и являются их обобщениями. При использовании векторных индексов следует следить за повторяющимися значениями индексов в левой части оператора присваивания, так как в этом случае будет осуществлена попытка записи в одну ячейку памяти, возможно, разных значений. Порядок индексов — произвольный (хотя этим не следует злоупотреблять во избежание снижения быстродействия).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Integer vi(5)/7,7,7,3,8/, vj(4)/1,2,3,10/  ! инициализация массивов - векторных индексов&lt;br /&gt;
Real arr(20,20), brr(10,10) &lt;br /&gt;
brr=0.; arr=1.              &lt;br /&gt;
         ! векторные индексы можно задавать и внутри использующего их массива&lt;br /&gt;
brr((/8,6,2,1,4/),vj)=arr(vi,vj) ! размерность векторных индексов должна совпадать слева и справа, а их значения - не выходить за пределы границ использующих их массивов&lt;br /&gt;
               ! размер векторных индексов может быть меньше размера рабочих массивов  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Встроенные функции для массивов ====&lt;br /&gt;
В современном Фортране имеется большое количество специализированных встроенных функций для работы с численными и символьными массивами (помимо разобранных выше общих способов). Аргументами функций выступают численный и/или символьный массив &#039;&#039;array&#039;&#039;, логический массив &#039;&#039;mask&#039;&#039; (являющийся, например, условием &#039;&#039;array&amp;gt;0&#039;&#039;) и измерение &#039;&#039;dim&#039;&#039; массива &#039;&#039;array&#039;&#039;, формирующее (если задан аргумент &#039;&#039;dim&#039;&#039;) сечение массива вдоль одного из измерений с номером &#039;&#039;dim&#039;&#039;. Массив &#039;&#039;array&#039;&#039; может быть, если не указано иное, целочисленным, содержать действительные или комплексные числа. Если массив-маска не задан, то его значение считается тождественно истинным. Логический массив &#039;&#039;mask&#039;&#039;, если задан, должен иметь ту же форму, что и массив &#039;&#039;array&#039;&#039;, либо скалярное значение &amp;lt;code&amp;gt;.TRUE.&amp;lt;/code&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Основная масса функций введена стандартом F’90.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ALL(mask[, dim])&amp;lt;/code&amp;gt; — логическая функция; возвращает «истина», если все элементы логического массива mask истинны (вдоль факультативного измерения &#039;&#039;dim&#039;&#039;) и наоборот в противном случае.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ANY(mask[, dim])&amp;lt;/code&amp;gt; — логическая функция; имеет значение «истина», если хотя бы один элемент логического массива mask истинен (вдоль факультативного измерения &#039;&#039;dim&#039;&#039;).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;COUNT(mask[, dim])&amp;lt;/code&amp;gt; — целочисленная функция; результат равен числу истинных элементов массива &#039;&#039;mask&#039;&#039; (вдоль факультативного измерения &#039;&#039;dim&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MAXLOC(array[, mask][, dim])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MINLOC(array[, mask][, dim])&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;br&amp;gt; — целочисленные функции, возвращающие соответственно индекс максимального и минимального элемента (или индексы максимальных и минимальных элементов) вдоль факультативного измерения &#039;&#039;dim&#039;&#039; для элементов, удовлетворяющих массиву-маске. Функции возвращают индекс первого по порядку следования элемента массива &#039;&#039;array&#039;&#039;. Если аргумент функций &#039;&#039;dim&#039;&#039; не задан, или если &#039;&#039;array&#039;&#039; — одномерный массив, то результат записывается в одномерный массив.&amp;lt;br&amp;gt;&lt;br /&gt;
Для многомерных массивов &#039;&#039;array&#039;&#039; результат записывается в массив с рангом, на единицу меньшим ранга массива &#039;&#039;array&#039;&#039; (исключается измерение с номером &#039;&#039;dim&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Значения индексов отсчитываются по порядку от нижних границ массива. То есть в случае, если номер нижней границы массива &#039;&#039;array&#039;&#039; отличается от единицы, то для доступа к максимальному или минимальному элементу массива следует прибавить к результату функций &amp;lt;code&amp;gt;MAXLOC&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MINLOC&amp;lt;/code&amp;gt; разницу между индексом нижней границы и единицей.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MAXVAL(array[, mask][, dim])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MINVAL(array[, mask][, dim])&amp;lt;/code&amp;gt; — функции поиска максимального и минимального элемента соответственно в массиве &#039;&#039;array&#039;&#039; для элементов, удовлетворяющих логическому массиву-маске &#039;&#039;mask&#039;&#039; вдоль факультативного измерения &#039;&#039;dim&#039;&#039;.&lt;br /&gt;
Результат функции — такого же типа и разновидности, что и массив &#039;&#039;array&#039;&#039;. Массив &#039;&#039;array&#039;&#039; может быть только вещественным или целочисленным.&amp;lt;br&amp;gt;&lt;br /&gt;
Для одномерного массива &#039;&#039;array&#039;&#039; или при отсутствии аргумента &#039;&#039;dim&#039;&#039; результатом является скаляр, иначе — массив с рангом, на единицу меньшим ранга массива &#039;&#039;array&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;FINDLOC(array, value[, dim][, mask])&amp;lt;/code&amp;gt; — целочисленная функция, возвращающая индекс равного &#039;&#039;value&#039;&#039; элемента массива &#039;&#039;array&#039;&#039;. Введена стандартом F2008. Искомые элементы массива удовлетворяют логическому массиву-маске &#039;&#039;mask&#039;&#039; вдоль факультативного измерения &#039;&#039;dim&#039;&#039;. Тип аргумента &#039;&#039;value&#039;&#039; должен совпадать с типом массива &#039;&#039;array&#039;&#039; и может быть любого встроенного типа (включая комплексный, логический или символьный). Остальные свойства функции аналогичны свойствам функций &amp;lt;code&amp;gt;MAXLOC&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MINLOC&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начиная со стандарта F2003, функции &amp;lt;code&amp;gt;MAXLOC&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MINLOC&amp;lt;/code&amp;gt;, как и функция &amp;lt;code&amp;gt;FINDLOC&amp;lt;/code&amp;gt;, оперируют также и символьными данными.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SUM(array[, mask][, dim])&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;PRODUCT(array[, mask][, dim])&amp;lt;/code&amp;gt; осуществляют соответственно суммирование и умножение элементов массива. Смысл аргументов функций &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;PRODUCT&amp;lt;/code&amp;gt; тот же, что и у выше рассмотренных функций. &amp;lt;br&amp;gt;&lt;br /&gt;
Функция &amp;lt;code&amp;gt;PRODUCT&amp;lt;/code&amp;gt; оперирует комплексными данными, начиная со стандарта F2003.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DOT_PRODUCT(vector_1, vector_2)&amp;lt;/code&amp;gt; осуществляет [[скалярное произведение]] по правилам [[Линейная алгебра|линейной алгебры]] векторов &#039;&#039;vector_1&#039;&#039; и &#039;&#039;vector_2&#039;&#039; (одномерных массивов) одинакового размера. Одномерные массивы &#039;&#039;vector_1&#039;&#039; и &#039;&#039;vector_2&#039;&#039; могут содержать данные любого численного и логического типа. Вектора &#039;&#039;vector_1&#039;&#039; и &#039;&#039;vector_2&#039;&#039; могут быть либо оба численными, либо оба — логическими.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MATMUL(matrix_a, matrix_b)&amp;lt;/code&amp;gt; — встроенная функция матричного перемножения. Перемножает две матрицы, матрицу на вектор, вектор на матрицу по правилам линейной алгебры. Аргументы функции &#039;&#039;matrix_a&#039;&#039; и &#039;&#039;matrix_b&#039;&#039; — двумерные или одномерные численные (любых встроенных численных типов) или логические массивы. Аргументами функции не могут быть одновременно два вектора: один из аргументов обязан быть матрицей (двумерным массивом). Число элементов первого (либо единственного) измерения массива &#039;&#039;matrix_b&#039;&#039; должно быть равно числу элементов последнего измерения массива &#039;&#039;matrix_a&#039;&#039;. Введена стандартом F’90.&amp;lt;br&amp;gt;&lt;br /&gt;
В некоторых случаях при расчёте произведения вектор-столбца на вектор-строку, требующего при использовании функции &amp;lt;code&amp;gt;MATMUL&amp;lt;/code&amp;gt; дополнительного преобразовывания векторов в матрицы формы &amp;lt;code&amp;gt;(/m,1/)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;(/1,n/)&amp;lt;/code&amp;gt;, эффективность &amp;lt;code&amp;gt;MATMUL&amp;lt;/code&amp;gt; по данным Бартеньева&amp;lt;ref name=&amp;quot;БартеньевСФ&amp;quot; /&amp;gt; заметно уступает обычному вложенному циклу.&amp;lt;br&amp;gt;&lt;br /&gt;
По тестам NASA&amp;lt;ref&amp;gt;{{Cite web|url = https://modelingguru.nasa.gov/docs/DOC-1762|title = Comparing Python, NumPy, Matlab, Fortran, etc.|author = Thomas Clune|work = NASA Modeling Guru|date = Nov 2, 2009 10:33 AM|publisher = |access-date = 2015-10-07|archive-date = 2015-10-23|archive-url = https://web.archive.org/web/20151023014748/https://modelingguru.nasa.gov/docs/DOC-1762|url-status = live}}&amp;lt;/ref&amp;gt; для произведения матриц (двумерных массивов) быстродействие &amp;lt;code&amp;gt;MATMUL&amp;lt;/code&amp;gt; компилятора фирмы Intel при использовании полной оптимизации &#039;&#039;[http://parallel.uran.ru/node/28 -O3]&#039;&#039; существенно (в некоторых случаях — на порядок) превышает быстродействие вложенных циклов, хотя для матриц размером ~1000×1000 и больше несколько уступает быстродействию подпрограммы [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f_source.html DGEMM] библиотеки [http://www.netlib.org/lapack/explore-html/index.html LAPAK]. В то же время для матриц ~100×100 и меньше &amp;lt;code&amp;gt;MATMUL&amp;lt;/code&amp;gt; превосходит по скорости DGEMM. Компилятор Фортрана фирмы IBM, начиная с версии F’90, использует для &amp;lt;code&amp;gt;MATMUL&amp;lt;/code&amp;gt; [[алгоритм Винограда — Штрассена]] со сложностью &amp;lt;math&amp;gt;{\rm O}(n^{2.81})&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;{{Статья|автор=Craig C. Douglas, Gordon Slishman|заглавие=Variants of Matrix-matrix Multiplication for Fortran-90|ссылка=http://doi.acm.org/10.1145/181498.181500|издание=SIGNUM Newsl.|год=1994-04-01|том=29|выпуск=2|страницы=4–6|issn=0163-5778|doi=10.1145/181498.181500|access-date=2016-05-25|archive-date=2021-08-09|archive-url=https://web.archive.org/web/20210809093344/https://dl.acm.org/doi/10.1145/181498.181500|url-status=live}}&amp;lt;/ref&amp;gt;. Отметим, что стандартом алгоритмические реализации математических функций обычно не оговариваются и остаются на усмотрение разработчика компилятора.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MERGE(t_source, f_source, mask)&amp;lt;/code&amp;gt; — функция, создающая новый массив под управлением маски-массива &#039;&#039;mask&#039;&#039; из элементов массивов &#039;&#039;t_source&#039;&#039; и &#039;&#039;f_source&#039;&#039; той же формы и того же размера, что и исходные массивы. Массивы-аргументы и массив-результат могут быть любого встроенного типа и совпадать по типу данных, размеру и форме. &amp;lt;br&amp;gt;&lt;br /&gt;
Если элемент &#039;&#039;mask&#039;&#039; есть истина (&amp;lt;code&amp;gt;.ТRUE.&amp;lt;/code&amp;gt;), то соответствующий ему элемент массива-результата равен соответствующему элементу массива &#039;&#039;t_source&#039;&#039;; если ложь (&amp;lt;code&amp;gt;.FALSE.&amp;lt;/code&amp;gt;) — то элементу массива &#039;&#039;f_source&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Аргументами функции могут быть скаляры; в этом случае, например, &amp;lt;code&amp;gt;MERGE(a,0,c&amp;gt;=0)&amp;lt;/code&amp;gt;=a·&#039;&#039;Θ(с)&#039;&#039;, где &#039;&#039;Θ(с)&#039;&#039; — целочисленная [[Функция Хевисайда|функция Хэвисайда]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MOVE_ALLOC(from, to)&amp;lt;/code&amp;gt; — встроенная подпрограмма, позволяющая динамически переразмещать ранее размещённый динамический массив &#039;&#039;to&#039;&#039; с новыми границами и размером, как у динамического массива &#039;&#039;from&#039;&#039;. При этом данные из массива &#039;&#039;from&#039;&#039; копируются в массив &#039;&#039;to&#039;&#039;. Тип данных и ранг массивов &#039;&#039;from&#039;&#039; и &#039;&#039;to&#039;&#039; должны совпадать. После переразмещения массива &#039;&#039;to&#039;&#039; массив &#039;&#039;from&#039;&#039; освобождает память и становится неразмещённым. Может быть полезна в численных методах с изменяющейся дискретизацией задачи ([[Многосеточный метод|многосеточных]] и [[Сетка (расчётная)#Адаптивные сетки|адаптивных]] методах). &amp;lt;br&amp;gt;&lt;br /&gt;
Введена стандартом F2003.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TRANSPOSE(matrix)&amp;lt;/code&amp;gt; — функция, [[Транспонированная матрица|транспонирующая]] (меняющая местами строки и столбцы) двумерную матрицу.&lt;br /&gt;
&lt;br /&gt;
В современном Фортране предусмотрены встроенные функции упаковки и распаковки многомерного массива в одномерный массив (и из одномерного массива, соответственно) под управлением логического условия для повышения быстродействия и экономии памяти.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PACK(array, mask [, vector])&amp;lt;/code&amp;gt; — функция; упаковывает многомерный массив любого типа &#039;&#039;array&#039;&#039; в одномерный массив-вектор под управлением логического массива &#039;&#039;mask&#039;&#039;. Необязательный одномерный массив &#039;&#039;vector&#039;&#039; должен иметь тот же тип данных, что и &#039;&#039;array&#039;&#039;, причём количество элементов в &#039;&#039;vector&#039;&#039;, если он задан, должно быть не меньше числа истинных элементов в &#039;&#039;mask&#039;&#039;. Если &#039;&#039;mask&#039;&#039; — скаляр со значением &amp;lt;code&amp;gt;.TRUE.&amp;lt;/code&amp;gt;, то число элементов в массиве &#039;&#039;vector&#039;&#039;, если он задан, должно быть не меньше, чем общее число элементов в &#039;&#039;array&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Результатом функции будет одномерный массив того же типа, что и &#039;&#039;array&#039;&#039;. Длина результата будет равна длине вектора &#039;&#039;vector&#039;&#039;, если он задан; если нет — то числу истинных элементов в массиве-маске &#039;&#039;mask&#039;&#039;. Если &#039;&#039;vector&#039;&#039; не задан, а &#039;&#039;mask&#039;&#039; — скаляр со значением &#039;&#039;истина&#039;&#039;, то длина результирующего одномерного вектора равна числу элементов массива &#039;&#039;array&#039;&#039;. &amp;lt;br&amp;gt;&lt;br /&gt;
Результирующий массив последовательно заполняется элементами массива &#039;&#039;array&#039;&#039; (в порядке их размещения в компьютерной памяти), удовлетворяющими истинным значениям массива &#039;&#039;mask&#039;&#039;. При этом, если задан &#039;&#039;vector&#039;&#039;, из него выбираются недостающие (возможно) элементы в массиве-результате, причём начиная с индекса, следующего за последним по порядку истинным элементом массива &#039;&#039;array&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Так, для массива &amp;lt;math&amp;gt;A=\begin{bmatrix} 0 &amp;amp; 1 &amp;amp; 0 \\ 2 &amp;amp; 0 &amp;amp; 0 \\ 0 &amp;amp; 0 &amp;amp; 3 \end{bmatrix}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
результатом функции &amp;lt;code&amp;gt;PACK(A, mask=A.NE.0)&amp;lt;/code&amp;gt; будет одномерный массив &amp;lt;math&amp;gt;\begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 3 \end{bmatrix}&amp;lt;/math&amp;gt;. Если дополнительно задан вектор &amp;lt;math&amp;gt;V=\begin{bmatrix} 77 &amp;amp; -95 &amp;amp; 0 &amp;amp; 4 &amp;amp; 5 &amp;amp; 6 &amp;amp; 7 &amp;amp; 8 &amp;amp; 9 &amp;amp; 10 \end{bmatrix}&amp;lt;/math&amp;gt;, то результатом &amp;lt;code&amp;gt;PACK(A, mask=A.NE.0, V)&amp;lt;/code&amp;gt; будет &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 3 &amp;amp; 4 &amp;amp; 5 &amp;amp; 6 &amp;amp; 7 &amp;amp; 8 &amp;amp; 9 &amp;amp; 10 \end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Файлы и операции ввода-вывода ===&lt;br /&gt;
Фортран обладает богатым встроенным инструментарием для операций ввода-вывода, в том числе для больших массивов данных. Файлы в Фортране бывают внутренние и внешние.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Внутренний файл&#039;&#039; — это любой массив, символьная строка или подстрока. Внутренние файлы всегда открыты по умолчанию. &#039;&#039;Внешний файл&#039;&#039; — это любой файл, внешний по отношению к выполняемой программе.&lt;br /&gt;
&lt;br /&gt;
С обоими типами файлов используются одни и те же операторы записи &amp;lt;code&amp;gt;WRITE&amp;lt;/code&amp;gt; и чтения &amp;lt;code&amp;gt;READ&amp;lt;/code&amp;gt;. Внутренние файлы используются для преобразований число-строка-число и для создания смешанных числовых и символьных записей.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Character(15) string&lt;br /&gt;
Real:: xyz=-123.456&lt;br /&gt;
Integer intg&lt;br /&gt;
&lt;br /&gt;
Write(string,*) xyz            ! Запись в строку числа -123.456&lt;br /&gt;
Print *, &#039;string=&#039;, string     ! string=␣ -123.4560␣ ␣&lt;br /&gt;
&lt;br /&gt;
Read (string,&#039;(I6)&#039;) intg      ! Чтение из строки целого числа&lt;br /&gt;
Print *, &#039;intg=&#039;, intg         ! intg=␣ -123&lt;br /&gt;
!...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внешние файлы подразделяются на форматные (текстовые, CR- и LF-потоки), бинарные (двоичные), непосредственно отображающие оперативную память, и неформатные (не двоичные). Кроме того, они могут быть файлами прямого и последовательного доступов с записями фиксированной и переменной длины (переменной — только для последовательных файлов), а также сегментированными записями (для очень больших неформатных последовательных файлов). Таким образом, Фортран позволяет создавать и обрабатывать довольно большое количество видов файлов — 15 способов организации.&lt;br /&gt;
Максимальный размер одной записи — два гигабайта.&lt;br /&gt;
&lt;br /&gt;
Файлы прямого доступа позволяют осуществлять операции ввода-вывода с записями с заданным номером (без затирания вышерасположенных или нижерасположенных записей в файле).&lt;br /&gt;
&lt;br /&gt;
При открытии последовательного файла его можно позиционировать в начало, в конец (перед записью «конец файла»), что позволяет добавлять данные по мере их накопления без затирания ранее введённых, а также либо в начало, либо в конец в зависимости от ранее определённого статуса файла (был он открыт ранее или нет).&lt;br /&gt;
&lt;br /&gt;
=== Работа с памятью ===&lt;br /&gt;
В современных стандартах языка (начиная с Fortran’90 или Fortran’95) возможна работа с тремя видами &#039;&#039;[[Фортран#Работа с массивами|динамических массивов]]&#039;&#039; (автоматическими, размещаемыми и массивами-ссылками), &#039;&#039;[[Указатель (тип данных)|указателями]]&#039;&#039;, &#039;&#039;[[Ссылка (программирование)|ссылками]]&#039;&#039;; имеются встроенные процедуры для работы с памятью напрямую и процедуры для побитовых операций.&lt;br /&gt;
&lt;br /&gt;
Стандарты языка предполагают автоматическое освобождение оперативной памяти, занятой любым типом динамического массива, после завершения работы программы или подпрограммы (процедуры, функции), даже если программистом освобождение не было выполнено явно. Это позволяет избегать возникновения [[Утечка памяти|утечек памяти]] при работе с динамическими массивами средствами Фортрана (при использовании указателей и в других случаях утечки возможны) при небрежности программирования&amp;lt;ref name=&amp;quot;БартеньевСФ&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Автоматические массивы (размещаемые компилятором) создаются при вызове подпрограммы и являются её локальными объектами. Их границы определяются всякий раз при обращении к процедуре; при этом при выходе из неё они уничтожаются, а память — очищается. Автоматические массивы во время выполнения программы находятся в [[стек]]е, размещаемые (с помощью оператора &amp;lt;code&amp;gt;ALLOCATE&amp;lt;/code&amp;gt;) — в [[Куча (память)|куче]]&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Указатели Фортрана аналогичны указателям Си&amp;lt;ref name=&amp;quot;БартеньевСФ&amp;quot; /&amp;gt;, однако при решении вычислительных задач и разработке математических алгоритмов они в большинстве случаев с успехом заменяются иными инструментами Фортрана.&lt;br /&gt;
&lt;br /&gt;
=== Управляющие конструкции ===&lt;br /&gt;
Начиная со стандарта F’90 конструкция условного перехода &amp;lt;code&amp;gt;IF THEN&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;ELSEIF THEN&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;END IF&amp;lt;/code&amp;gt; не отличается от подобных конструкций в других современных языках и заменила т. н. «арифметический» &amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt; с метками, признанный устаревшим&amp;lt;ref name=&amp;quot;:1&amp;quot; /&amp;gt;. Существует и более простая форма условного оператора: &amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;(&#039;&#039;логическое&#039;&#039; &#039;&#039;условие&#039;&#039;)&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&#039;&#039;оператор&#039;&#039;&amp;lt;/code&amp;gt;, где исполняемый оператор должен быть единственным после оператора &amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt;, например, &amp;lt;code&amp;gt;Goto&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&#039;&#039;метка&#039;&#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Конструкция выбора &amp;lt;code&amp;gt;SELECT CASE&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;CASE DEFAULT&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;END SELECT&amp;lt;/code&amp;gt;, наоборот, отличается от конструкции &amp;lt;code&amp;gt;SWITCH&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt; в Си-подобных языках, таких как: [[C++]]&amp;lt;ref&amp;gt;{{Cite web|url=https://msdn.microsoft.com/ru-ru/library/k0t5wee3.aspx|title=Оператор switch (C++)|publisher=msdn.microsoft.com|access-date=2016-06-05|archive-date=2016-08-13|archive-url=https://web.archive.org/web/20160813164540/https://msdn.microsoft.com/ru-ru/library/k0t5wee3.aspx|url-status=live}}&amp;lt;/ref&amp;gt;, [[Java]]&amp;lt;ref&amp;gt;{{Cite web|url=https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html|title=The switch Statement|lang=en|publisher=[[Oracle|oracle.com]]|url-status=live|access-date=2024-08-15|archive-date=2010-03-15|archive-url=https://web.archive.org/web/20100315060844/http://java.sun.com/docs/books/tutorial/java/nutsandbolts/switch.html}}&amp;lt;/ref&amp;gt;, [[JavaScript]]&amp;lt;ref&amp;gt;{{Cite web|url=https://learn.javascript.ru/switch|title=Конструкция &amp;quot;switch&amp;quot;|lang=ru|url-status=live|access-date=2016-06-05|archive-date=2016-06-09|archive-url=https://web.archive.org/web/20160609052431/http://learn.javascript.ru/switch}}&amp;lt;/ref&amp;gt; и других, несколько напоминая по возможностям оператор &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt; в [[Паскаль (язык программирования)|Паскале]]&amp;lt;ref&amp;gt;{{Cite web|url=http://www.freepascal.org/docs-html/ref/refsu57.html|title=The Case statement|publisher=www.freepascal.org|access-date=2016-06-05|archive-date=2016-05-22|archive-url=https://web.archive.org/web/20160522221450/http://www.freepascal.org/docs-html/ref/refsu57.html|url-status=live}}&amp;lt;/ref&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Integer N(74)             ! выражение выбора — это целое, логическое, символьное выражение или&lt;br /&gt;
...                       ! целочисленый массив, или массив символов с любым ненулевым числом элементов &lt;br /&gt;
&lt;br /&gt;
nameSC: Select Case(N(i)) ! nameSC — имя конструкции, N(i) — элемент массива&lt;br /&gt;
        Case(:-5)         ! выполняется для всех N(i), меньших либо равных -5 с шагом +1&lt;br /&gt;
        ! Блок 1&lt;br /&gt;
        &lt;br /&gt;
        Case(-3,-1,0,2)   ! для переменной N(i), равной -3, -1, 0, 2&lt;br /&gt;
        ! Блок 2&lt;br /&gt;
        &lt;br /&gt;
        Case(50:100)      ! для N(i) в диапазоне от 50 до 100 включительно (шаг +1)&lt;br /&gt;
        ! Блок 3&lt;br /&gt;
        &lt;br /&gt;
        Case(400)         ! для N(i)=400&lt;br /&gt;
        ! Блок 4&lt;br /&gt;
        &lt;br /&gt;
        Case(1,20:30,35)  ! для N(i)=1, N(i) в диапазоне от 20 до 30 включительно и N(i)=35&lt;br /&gt;
        ! Блок 5&lt;br /&gt;
        &lt;br /&gt;
        Case Default      ! для всех прочих ситуаций. Case Default — опциональный, необязательный оператор&lt;br /&gt;
        ! Блок по умолчанию&lt;br /&gt;
        End Select nameSC&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Если значение переменной N, называемой выражением выбора, совпадёт со списком селекторов (списком значений или диапазоном) в к-либо операторе &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt;, например, в третьем для &#039;&#039;N=70&#039;&#039;, то, после выполнения соответствующего блока операторов &#039;&#039;Блок-3&#039;&#039;, происходит &#039;&#039;выход из конструкции&#039;&#039; &amp;lt;code&amp;gt;SELECT CASE&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;БартеньевСФ&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;, и операторов прерывания (типа &amp;lt;code&amp;gt;BREAK&amp;lt;/code&amp;gt;) &#039;&#039;не требуется&#039;&#039;. Оператор &amp;lt;code&amp;gt;CASE DEFAULT&amp;lt;/code&amp;gt;, равно как и имя конструкции, не является необходимым. Диапазоны в списках селекторов различных операторов &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt; не должны пересекаться или иметь хотя бы одного общего элемента.&lt;br /&gt;
&lt;br /&gt;
В качестве выражения выбора (N) может быть элемент целочисленного массива.&lt;br /&gt;
&lt;br /&gt;
Диапазоны в списках селекторов применяются только для целых или для символов, по возрастанию от нижней границы к верхней; для символов — по возрастанию [[Кодировка символов|их кодов]].&lt;br /&gt;
&lt;br /&gt;
В современном Фортране существуют две формы циклов со счётчиком итераций: традиционная конструкция &amp;lt;code&amp;gt;DO&amp;lt;/code&amp;gt;—&amp;lt;code&amp;gt;ENDDO&amp;lt;/code&amp;gt; и цикл с меткой. Последняя признана устаревшей конструкцией начиная со стандарта F’90, однако до сих пор входит в стандарты. Для вложенных циклов с большим уровнем вложенности последняя форма может быть более лаконичной: &amp;lt;syntaxhighlight lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
! Синтаксис устаревшей конструкции цикла&lt;br /&gt;
    do 1 k=1,10      ! 1- это метка конца цикла&lt;br /&gt;
      do 1 j=1,20    ! метка может быть одинаковой для вложенных циклов&lt;br /&gt;
        do 1 i=1,100&lt;br /&gt;
    arr(i,j,k)=25    &lt;br /&gt;
1   Continue         ! метка может стоять только перед к-либо оператором&lt;br /&gt;
&lt;br /&gt;
L1: do k=1,10        ! однако современная запись допускает именовать циклы,&lt;br /&gt;
  L2: do j=1,20    ! что больше соответствует концепции структурного программирования&lt;br /&gt;
    L3: do i=1,100 ! и позволяет легче избежать ошибок &lt;br /&gt;
    arr(i,j,k)=25    &lt;br /&gt;
    end do L3&lt;br /&gt;
  end do L2&lt;br /&gt;
end do L1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Заголовок цикла со счётчиком имеет следующий полный вид:&amp;lt;syntaxhighlight lang=&amp;quot;fortran&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
name: DO I=N1, N2, dN  ! имя конструкции необязательно&lt;br /&gt;
...                    ! N1 — начальное значение счётчика, N2 — конечное, dN — шаг (параметры цикла)&lt;br /&gt;
      END DO name      ! Параметры цикла — целые числа произвольного знака. dN не равно нулю.           &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Число выполнения тела цикла без прерывания равно &#039;&#039;N&amp;lt;sub&amp;gt;с&amp;lt;/sub&amp;gt;&#039;&#039;=&amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt;(&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&#039;&#039;((N&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;-N&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;+dN)/dN), 0&#039;&#039;) и может быть равным нулю.&lt;br /&gt;
&lt;br /&gt;
Например, цикл выполнится нуль раз, если &#039;&#039;N&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;N&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&#039;&#039; и шаг положителен: &#039;&#039;dN&amp;gt;0&#039;&#039;. Если шаг отрицательный, &#039;&#039;dN&amp;lt;0,&#039;&#039; то цикл пройдёт в обратном порядке, при этом для выполнения цикла необходимо, чтобы &#039;&#039;N&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;N&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&#039;&#039;. Если шаг &#039;&#039;dN&#039;&#039; опущен, то по умолчанию он считается равным единице: &#039;&#039;dN=1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Значение переменной цикла &#039;&#039;I&#039;&#039; после выхода из него всегда равно &#039;&#039;N&amp;lt;sub&amp;gt;с&amp;lt;/sub&amp;gt;+1&#039;&#039;, то есть &#039;&#039;на единицу больше числа итераций цикла&#039;&#039; и не менее единицы: &#039;&#039;I≥1.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Возможен также цикл с условием &amp;lt;code&amp;gt;DO WHILE&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;(&#039;&#039;логическое&#039;&#039; &#039;&#039;условие&#039;&#039;)&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;END DO&amp;lt;/code&amp;gt;, и бесконечный цикл &amp;lt;code&amp;gt;DO&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;END DO&amp;lt;/code&amp;gt;, имеющие стандартную форму.&lt;br /&gt;
&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;CYCLE&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&#039;&#039;имя цикла&#039;&#039;&amp;lt;/code&amp;gt; прерывает &#039;&#039;текущую&#039;&#039; итерацию цикла и переходит к следующей итерации этого же цикла. Если имя цикла не указано, то выполняется прерывание итерации текущего цикла (в котором расположен оператор &amp;lt;code&amp;gt;CYCLE&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;EXIT&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&#039;&#039;имя цикла&#039;&#039;&amp;lt;/code&amp;gt; прерывает выполнение цикла с указанным именем и передаёт управление далее, а при отсутствии имени — прерывает текущий цикл (в который вложен оператор &amp;lt;code&amp;gt;EXIT&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Операторы &amp;lt;code&amp;gt;CYCLE&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;EXIT&amp;lt;/code&amp;gt; логически тождественны оператору &amp;lt;code&amp;gt;GOTO&amp;lt;/code&amp;gt; (в соответствующих обстоятельствах), но существенно облегчают понимание и обслуживание кода программистом.&lt;br /&gt;
&lt;br /&gt;
== Компиляторы ==&lt;br /&gt;
[[Файл:UCSD3.png|thumb|Экран редактора Фортрана в [[UCSD p-System]] на [[Apple II]]]]&lt;br /&gt;
С момента первоначальной разработки языка [[компилятор]]ы Фортрана производит фирма IBM. В настоящее время фирмой IBM поставляется оптимизирующий компилятор [[VS Fortran]]&amp;lt;ref&amp;gt;{{Cite web |url=http://www.ibm.com/software/awdtools/fortran/vsfortran/ |title=VS FORTRAN |access-date=2010-03-08 |archive-date=2021-08-09 |archive-url=https://web.archive.org/web/20210809093343/https://www.ibm.com/products/software |url-status=live }}&amp;lt;/ref&amp;gt; для [[мэйнфрейм]]ов [[IBM System z]], история развития различных версий которого восходит ещё к [[1964 год]]у, а также компилятор [[XL Fortran]]&amp;lt;ref&amp;gt;{{Cite web |url=http://www.ibm.com/software/products/ru/ru/xlfortran-linux |title=XL Fortran for Linux |access-date=2010-03-08 |archive-date=2021-08-09 |archive-url=https://web.archive.org/web/20210809093358/https://www.ibm.com/products/software |url-status=live }}&amp;lt;/ref&amp;gt; для платформ на базе архитектуры [[PowerPC]] — [[AIX]], [[Linux]] и суперкомпьютера [[Blue Gene]] (выпускалась также версия для [[Mac OS X]], когда компьютеры [[Macintosh]] использовали процессоры PowerPC). Оба этих компилятора содержат очень сложные оптимизаторы, являющиеся результатом непрерывной научной работы специалистов IBM на протяжении полувека. На базе компилятора IBM Fortran XL фирмой Absoft, бизнес-партнёром IBM, создан и поставляется компилятор Absoft Pro Fortran для систем на базе процессоров PowerPC (Linux, Mac OS X) и Intel (Linux, Mac OS X, Windows)&amp;lt;ref&amp;gt;{{Cite web |url=http://www.absoft.com/Absoft%20Compilers.htm |title=Absoft Pro Fortran Compiler Suites General Overview |access-date=2010-03-08 |archive-date=2021-08-09 |archive-url=https://web.archive.org/web/20210809093346/https://www.absoft.com/products/ |url-status=live }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существовала реализация Фортрана для [[Виртуальная машина|виртуальной машины]] [[UCSD p-System]], которая позволяла создавать исполняемый код независимый от аппаратной платформы.&lt;br /&gt;
&lt;br /&gt;
До [[1997]] крупным производителем компилятора Фортран для операционной системы Windows была корпорация [[Microsoft]]. Впоследствии она отказалась от их разработки в связи с низкой прибыльностью. После этого компилятор поставляла фирма [[Digital Equipment Corporation|DEC]], вошедшая в 1998 году в состав [[Compaq]] и вместе с последней в 2002 году слившаяся с [[Hewlett-Packard|HP]]. Дальнейшей разработкой этой версии компилятора стала заниматься фирма [[Intel]], а компилятор называется [[Intel Fortran Compiler]], который позволяет оптимизировать код под платформы Intel IA-32, x86_64 и IA-64.&lt;br /&gt;
&lt;br /&gt;
Компания DEC поставляет компилятор, интегрированный в среду разработки [[Digital Visual Fortran]], основанную на [[Microsoft Visual Studio]]. Наиболее известными продуктами этой линейки являются FPS 4.0 (Microsoft Fortran Power Station), DVF 5.0 и 6.0. Каждый компилятор может поддерживать несколько стандартов Фортрана. Слияния компаний явились причиной того, что последующие продукты появлялись на рынке под торговыми марками Compaq и HP. В настоящее время HP продаёт среду разработки версии 6.6 для Intel/win32. Поддержка Фортрана реализована также для всех высокопроизводительных платформ HP.&lt;br /&gt;
&lt;br /&gt;
Другим крупным поставщиком систем разработки на Фортране является фирма [[Lahey]], предлагающая интегрированные решения для Windows и Linux.&lt;br /&gt;
&lt;br /&gt;
Долгое время лучшим компилятором Фортрана для PC считался компилятор фирмы [[Watcom]], который был выделен в отдельный проект [[Open Watcom]], развивающий компилятор на открытой основе.&lt;br /&gt;
&lt;br /&gt;
Среди бесплатных компиляторов Фортран следует выделить компилятор от бывшей [[Sun Microsystems]] (сейчас Oracle), входящий в состав [[Sun Studio]], который генерирует эффективный код под [[SPARC]], [[x86]] и [[x86-64]]&amp;lt;ref&amp;gt;{{Cite web |url=http://developers.sun.com/sunstudio/products/benchmarks.html |title=Sun Studio — Benchmarks |access-date=2007-11-20 |archive-date=2007-10-26 |archive-url=https://web.archive.org/web/20071026005042/http://developers.sun.com/sunstudio/products/benchmarks.html |url-status=live }}&amp;lt;/ref&amp;gt; и доступен для ОС [[Solaris]], [[OpenSolaris]] и [[GNU/Linux]].&lt;br /&gt;
&lt;br /&gt;
Фонд свободного программного обеспечения [[GNU]] выпускал открытый компилятор Фортрана-77 [[g77]], доступный практически для любой платформы и полностью совместимый с [[GCC]]. Сейчас ему на смену пришёл компилятор [[GFortran]], в котором реализованы практически все конструкции стандарта Фортран-95 и многие конструкции стандартов Фортран-2003, Фортран-2008 и Фортран-2018. Он также полностью обратно совместим с Фортран-77. Также существует независимый проект [[g95]] по созданию на основе [[GCC]] компилятора Фортран-95.&lt;br /&gt;
&lt;br /&gt;
== Взаимодействие с другими языками ==&lt;br /&gt;
Многие системы программирования позволяют компоновать полученные в результате трансляции фортрановской программы [[объектный файл|объектные файлы]] с объектными файлами, полученными от компиляторов с других языков, что позволяет создавать более гибкие и многофункциональные приложения. Для языка Фортран также доступно большое количество библиотек, содержащих как подпрограммы решения классических вычислительных задач ([[LAPACK]], [[IMSL]], [[BLAS]]), задач организации распределённых вычислений ([[Message Passing Interface|MPI]], [[PVM]]), так и задач построения графических интерфейсов ([[Quickwin]], [[FORTRAN/TK]]) или доступа к [[СУБД]] ([[Oracle (СУБД)|Oracle]]).&lt;br /&gt;
&lt;br /&gt;
== Фортран в СССР ==&lt;br /&gt;
Фортран в [[СССР]] появился позже, чем на Западе, поскольку поначалу в СССР более перспективным языком считался [[Алгол]]. Во внедрении Фортрана большую роль сыграло общение советских физиков со своими коллегами из [[CERN]], где в 1960-х годах почти все расчёты велись с использованием программ на Фортране&amp;lt;ref&amp;gt;{{Cite web |url=http://samlib.ru/r/rastorguew_a_a/fortran.shtml |title=Очерк Александра Расторгуева о появлении Фортрана в Дубне |access-date=2012-01-22 |archive-date=2014-07-10 |archive-url=https://web.archive.org/web/20140710010357/http://samlib.ru/r/rastorguew_a_a/fortran.shtml |url-status=live }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Первый советский [[компилятор]] с Фортрана был создан в 1967 году для машины [[Минск (компьютер)|Минск-2]], однако он не получил большой известности. Широкое внедрение Фортрана началось после создания в 1968 году компилятора ФОРТРАН-ДУБНА для машины [[БЭСМ-6]]. Фортран — основной язык для [[АСВТ]] и [[СМ ЭВМ]], часто использовался вместе с [[препроцессор]]ом [[РАТФОР]]. Машины [[ЕС ЭВМ]], появившиеся в [[1972 год]]у, уже изначально имели [[транслятор]] Фортрана («позаимствованный» с [[IBM/360]] вместе с другим программным обеспечением).&lt;br /&gt;
&lt;br /&gt;
В 1970-x годах в [[ИПМ РАН|ИПМ]] была разработана графическая библиотека [[Графор|ГРАФОР]] («Графическое РАсширение ФОРтрана»)&amp;lt;ref&amp;gt;{{Cite web |url=http://www.graphicon.ru/ru/russia/history |title=История компьютерной графики в России |access-date=2012-01-08 |archive-url=https://web.archive.org/web/20120317205453/http://graphicon.ru/ru/russia/history |archive-date=2012-03-17 |url-status=dead }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В конце 1980-х — начале 1990-х физик [[Зарецкий, Андрей Владленович|Андрей Зарецкий]] создал серию детских книжек, одним из главных героев которых был [[Энциклопедия профессора Фортрана|профессор Фортран]], доступным языком объяснявший детям основы [[Компьютерная грамотность|компьютерной грамотности]] и программирования&amp;lt;ref&amp;gt;{{cite news |title=Энциклопедия профессора Фортрана |url=http://www.sutki.net/culture/17088-entsiklopediya_professora_fortrana.html |work=Sutki.net |date=2008-01-29 |access-date=2013-06-11 |archive-url=https://web.archive.org/web/20120310055828/http://www.sutki.net/culture/17088-entsiklopediya_professora_fortrana.html|archive-date=2012-03-10}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite news |first=Александр |last=Кириленко |title=Эстония вводит программирование в школах начиная с младших классов |url=http://noos.com.ua/ru/post/2984 |work=Ноосфера |date=2009-09-07 |access-date=2013-06-11 |archive-url=https://web.archive.org/web/20120909193515/http://www.noos.com.ua/ru/post/2984 |archive-date=2012-09-09}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Программирование, отладка и решение задач на ЭВМ единой серии. Язык Фортран: для вузов / под ред. И. А. Кудряшова. Л., Энергоатомиздат, 1988 - 203 стр.&lt;br /&gt;
* {{книга |заглавие=Fortran. Programmer&#039;s Reference Manual. The Fortran Automatic Coding System for the IBM 704 EDPM |ссылка=http://bitsavers.informatik.uni-stuttgart.de/pdf/ibm/704/704_FortranProgRefMan_Oct56.pdf |год=1956 |издательство=IBM Corp. |страниц=51}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор=Роберт У. Себеста.&lt;br /&gt;
|часть=2.3. Компьютер IBM 704 и язык Фортран&lt;br /&gt;
|заглавие=Основные концепции языков программирования&lt;br /&gt;
|ссылка=https://archive.org/details/libgen_00052588&lt;br /&gt;
|оригинал=Concepts of Programming Languages&lt;br /&gt;
|ответственный=Пер. с англ&lt;br /&gt;
|издание=5-е изд&lt;br /&gt;
|место=М.|издательство=[[Вильямс (издательство)|Вильямс]]&lt;br /&gt;
|год=2001&lt;br /&gt;
|страницы=[https://archive.org/details/libgen_00052588/page/n63 63]—69&lt;br /&gt;
|страниц=672&lt;br /&gt;
|isbn=5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.)&lt;br /&gt;
|тираж=5000&lt;br /&gt;
}}&lt;br /&gt;
* [http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=50459 ISO/IEC 1539-1:2010 Information technology — Programming languages — Fortran — Part 1: Base language]&lt;br /&gt;
* [http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=26934 ISO/IEC 1539-2:2000 Information technology — Programming languages — Fortran — Part 2: Varying length character strings]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{Навигация}}&lt;br /&gt;
* [https://web.archive.org/web/20071125181109/http://www.visual.2000.ru/develop/fortran/index.htm О старом Фортране замолвлено слово…]&lt;br /&gt;
* [http://rsusu1.rnd.runnet.ru/develop/fortran/prof77/prof77.html Professional Programmer’s Guide to Fortran77]{{ref|en}}&lt;br /&gt;
* [http://gcc.gnu.org/fortran/ gfortran] — Компилятор Фортрана 95/2003/2008, часть [[GNU Compiler Collection|Коллекции компиляторов GNU]]{{ref|en}}&lt;br /&gt;
* [http://progopedia.ru/language/fortran/ Статья Фортран] в [[Прогопедия|Прогопедии]] — энциклопедии языков программирования{{ref|ru}}&lt;br /&gt;
&lt;br /&gt;
{{ВС}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Фортран| ]]&lt;br /&gt;
[[Категория:Объектно-ориентированные языки программирования]]&lt;br /&gt;
[[Категория:Языки программирования по алфавиту]]&lt;br /&gt;
[[Категория:Статьи с примерами кода на Фортране]]&lt;/div&gt;</summary>
		<author><name>31.41.59.210</name></author>
	</entry>
</feed>