text: Электро́нная по́чта ( , от ) — технология и служба по пересылке и получению электронных сообщений (называемых «письма», «электронные письма» или «сообщения») между пользователями компьютерной сети (в том числе — Интернета). Электронная почта по составу элементов и принципу работы практически повторяет систему обычной (бумажной) почты, заимствуя как термины (почта, письмо, конверт, вложение, ящик, доставка и другие), так и характерные особенности — простоту использования, задержки передачи сообщений, достаточную надёжность и, в то же время, отсутствие гарантии доставки. Достоинствами электронной почты являются: легко воспринимаемые и запоминаемые человеком адреса вида имя_пользователя@имя_домена (например somebody@example.com); возможность передачи как простого текста, так и форматированного, а также произвольных файлов (текстовые документы, медиафайлы, программы, архивы и т. д.); независимость серверов (в общем случае они обращаются друг к другу непосредственно); достаточно высокая надёжность доставки сообщения; простота использования человеком и программами, высокая скорость передачи сообщений. Недостатки электронной почты: наличие такого явления, как спам (массовые рекламные и вирусные рассылки); возможные задержки доставки сообщения (до нескольких суток); ограничения на размер одного сообщения и на общий размер сообщений в почтовом ящике (персональные для пользователей). В настоящее время любой начинающий пользователь может завести свой бесплатный электронный почтовый ящик, достаточно зарегистрироваться на одном из интернет-порталов. Названия Если в Европе, Америке и др. регионах при написании используются только два варианта — «email» или «e-mail» (причём рекомендации о том, писать дефис или нет, разнятся: например, с марта 2011 года одно из стилистических руководств — AP Stylebook — рекомендует писать сокращение от «электронная почта» как «email», а не «e-mail»), то в русском языке присутствует значительная вариативность. Наиболее часто в кириллических текстах также используется «e-mail», то есть написание латиницей без транслитерации (визуальное восприятие других форм написания хуже). Но можно встретить и другие написания: электронная почта, эл. почта; интернет-почта; имейл (транскрипция с английского); е-мейл, емейл, емайл, е-мэйл, мейл (различные варианты транслитерации и её сокращения). Справочное бюро Грамота.ру сначала указывало, что рекомендуется писать e-mail (латиницей) или имейл (кириллицей), а затем стало рекомендовать только кириллическое написание имейл, как зафиксированное, например, в Русском орфографическом словаре РАН. В словарях зафиксировано четыре вариантных написания: имейл, мейл и-мейл, и-мэйл. Де-факто в официальных русскоязычных документах: в тексте (в смысле «способ связи») употребляют выражение «электронная почта»; в списке контактов используют префикс «e-mail» (E-mail: user@example.com). История Появление электронной почты можно отнести к 1965 году, когда сотрудники Массачусетского технологического института (MIT) Ноэль Моррис и Том Ван Влек написали программу mail для операционной системы CTSS (Compatible Time-Sharing System), установленную на компьютере IBM 7090/7094. Общее развитие электронной почты шло через развитие локального взаимодействия пользователей на многопользовательских системах. Пользователи могли, используя программу mail (или её эквивалент), пересылать друг другу сообщения в пределах одного мейнфрейма (большого компьютера). Следующий шаг был в возможности переслать сообщение пользователю на другой машине — для этого использовалось указание имени машины и имени пользователя на машине. Адрес мог записываться в виде foo!joe (пользователь joe на компьютере foo). Третий шаг для становления электронной почты произошёл в момент появления передачи писем через третий компьютер. В случае использования UUCP адрес пользователя включал в себя маршрут до пользователя через несколько промежуточных машин (например, gate1!gate2!foo!joe — письмо для joe через машину gate1, gate2 на машину foo). Недостатком такой адресации было то, что отправителю (или администратору машины, на которой работал отправитель) необходимо было знать точный путь до машины адресата. После появления распределённой глобальной системы имён DNS для указания адреса стали использоваться доменные имена — user@example.com — пользователь user на машине example.com. Одновременно с этим происходило переосмысление понятия «на машине»: для почты стали использоваться выделенные серверы, на которые не имели доступ обычные пользователи (только администраторы), а пользователи работали на своих машинах, при этом почта приходила не на рабочие машины пользователей, а на почтовый сервер, откуда пользователи забирали свою почту по различным сетевым протоколам (среди распространённых на настоящий момент — POP3, IMAP, MAPI, веб-интерфейсы). Одновременно с появлением DNS была придумана система резервирования маршрутов доставки почты, а доменное имя в почтовом адресе перестало быть именем конкретного компьютера и стало просто фрагментом почтового адреса. За обслуживание домена могут отвечать многие серверы (возможно, физически размещённые на разных континентах и в разных организациях), а пользователи из одного домена могут не иметь между собой ничего общего (особенно подобное характерно для пользователей бесплатных серверов электронной почты). Кроме того, существовали и другие системы электронной почты (некоторые из них существуют и сейчас), как то: Netmail в сети Фидонет, X.400 в сетях X.25. Доступ к ним из сети Интернет и обратно осуществляется через почтовый шлюз. Для маршрутизации почты в сетях X.25 в DNS предусмотрена специальная ресурсная запись c соответствующим названием X25 (код 19). Хронология 1996 год, 4 июля (день Независимости США) — начало коммерческого функционирования почтового сервиса Hotmail. Дата старта сервиса символизировала освобождение от интернет-провайдеров. 1997 год, 8 марта — компания Yahoo! приобретает портал RocketMail — один из первых бесплатных почтовых сервисов. Появление сервиса Yahoo! Mail. 1998 год, 15 октября — заработала бесплатная электронная почта от Mail.ru. 2000 год, 26 июня — запущена Яндекс.Почта — бесплатный почтовый сервис от компании Яндекс. 2000 год, 1 августа — запущена Рамблер/почта — бесплатный почтовый сервис от компании Рамблер. 2004 год, 1 апреля — запущен бесплатный почтовый сервис Gmail от компании Google. MxA-классификация В терминологии электронной почты выделяются следующие компоненты: MTA ( — агент пересылки почты) — отвечает за пересылку почты между почтовыми серверами; как правило, первый MTA в цепочке получает сообщение от MUA, последний передаёт сообщение к MDA; возможна реализация с отправкой почты через smart host. MDA ( — агент доставки почты) — отвечает за доставку почты конечному пользователю. MUA ( — почтовый агент пользователя; в русской нотации закрепился термин почтовый клиент) — программа, обеспечивающая пользовательский интерфейс, отображающая полученные письма и предоставляющая возможность отвечать, создавать, перенаправлять письма. MRA () — почтовый сервер, забирающий почту с другого сервера по протоколам, предназначенным для MDA. В случае использования выделенных серверов для хранения почты пользователей всё взаимодействие пользователя с сервером может происходить по протоколам, не укладывающимся в эту схему. Почтовые серверы обычно выполняют функцию MTA и MDA. Некоторые почтовые серверы (программы) выполняют функцию как MTA, так и MDA, некоторые подразумевают разделение на два независимых сервера: сервер-MTA и сервер-MDA (при этом если для доступа к ящику используются различные протоколы, например POP3 и IMAP, то MDA, в свою очередь, может быть реализован либо как единое приложение, либо как набор приложений, каждое из которых отвечает за отдельный протокол). Современная архитектура (SMTP) Общепринятым в мире протоколом обмена электронной почтой является SMTP ( — простой протокол передачи почты). В общепринятой реализации он использует DNS для определения правил пересылки почты (хотя в частных системах, вроде Microsoft Exchange, SMTP может действовать, исходя из информации из других источников). В различных доменах настроены свои, независимые друг от друга почтовые системы. У каждого почтового домена может быть несколько пользователей. (Однако фактически может быть так, что одна организация или персона владеет многими доменами, которые обслуживаются (физически) одной почтовой системой). Почта передаётся между узлами с использованием программ пересылки почты (, MTA; такими, как, например: sendmail, exim4, postfix, Microsoft Exchange Server, Lotus Domino и т. д.). Поведение систем при связи друг с другом строго стандартизировано, для этого используется протокол SMTP (и соблюдение этого стандарта, наравне со всеобщей поддержкой DNS всеми участниками, является основой для возможности связи «всех со всеми» без предварительных договорённостей). Взаимодействие почтовой системы и пользователей, в общем случае, никак не регламентируется и может быть произвольным, хотя существуют как открытые, так и закрытые (завязанные на ПО конкретных производителей) протоколы взаимодействия между пользователями и почтовой системой. Программа, работающая в почтовой системе и обслуживающая пользователей, называется MDA (, агент доставки почты). В некоторых почтовых системах MDA и MTA могут быть объединены в одну программу, в других системах могут быть разнесены в виде разных программ или вообще выполняться на различных серверах. Программа, с помощью которой пользователь осуществляет доступ, называется MUA (). В случае использования веб-интерфейса для работы с почтой, её функцию выполняет приложение веб-интерфейса, запускаемое на сервере. Внутри заданной почтовой системы (обычно находящейся в рамках одной организации) может быть множество почтовых серверов, выполняющих как пересылку почты внутри организации, так и другие, связанные с электронной почтой задачи: фильтрацию спама, проверку вложений антивирусом, обеспечение автоответа, архивация входящей/исходящей почты, обеспечение доступа пользователям различными методами (от POP3 до ActiveSync). Взаимодействие между серверами в рамках одной почтовой системы может быть как подчинено общим правилам (использование DNS и правил маршрутизации почты с помощью протокола SMTP), так и следовать собственным правилам компании (используемого программного обеспечения). Релеи DNS позволяет указать в качестве принимающего сервера (MX-запись) любой узел интернета, не обязательно являющийся частью доменной зоны домена получателя. Это может использоваться для настройки релеинга (пересылки) почты через третьи серверы. Сторонний сервер (например, более надёжный, чем серверы пользователя) принимает почту для домена пользователя и пересылает его на почтовые серверы пользователя, как только появляется возможность. Исторически контроля над тем, «кому пересылать» почту, не было (или этому не придавали должного значения) и серверы без подобного контроля передавали почту на любые домены. Такие серверы называются открытыми релеями (в настоящее время новые открытые релеи появляются в основном из-за ошибок в конфигурировании). Для своих пользователей серверы почтовой системы являются релеями (пользователи отправляют почту не на серверы почтовой системы адресата, а на «свой» почтовый сервер, который передаёт письма далее). Во многих сетях провайдеров возможность отправлять письма по протоколу SMTP за пределы сети закрыта (из-за использования этой возможности троянами, вирусами). В этом случае провайдер предоставляет свой SMTP-сервер, через который и направляется вся почта за пределы сети. Открытым релеем при этом считается такой релей, который не проверяет, является ли пользователь «своим» (проверка может осуществляться как на основании сетевого адреса компьютера пользователя, так и на основании идентификации пользователя паролем/сертификатом). Маршрутизация почты Почтовый сервер, получив почту (из локального источника или от другого сервера) проверяет, существуют ли специфичные правила для обработки почты (правила могут основываться на имени пользователя, на домене в адресе, на содержимом письма и т. д.), если специфичных правил не обнаружено, то проверяется, является ли почтовый домен локальным для сервера (то есть является ли сервер конечным получателем письма). Если является, то письмо принимается в обработку. Если же домен письма не является локальным, то применяется процедура маршрутизации почты (являющаяся основой для передачи писем между различными серверами в Интернете). При маршрутизации используется только доменная часть адреса получателя (то есть часть, находящаяся после символа @). Для домена получателя ищутся все MX-записи. Они сортируются в порядке убывания приоритета. Если адрес почтового сервера совпадает с одним из узлов, указанных в MX-записях, — все записи с приоритетом, меньшим приоритета узла в MX-записи (а также MX-запись самого узла), отбрасываются, а доставка осуществляется на первый отвечающий узел (узлы пробуются в порядке убывания приоритета). Это сделано на случай, если почтовый сервер отправителя является релеем почтового сервера получателя. Если MX-запись для домена не найдена, то делается попытка доставить почту по A-записи, соответствующей домену. Если же записи о домене нет, то формируется сообщение о невозможности доставки (bounce message). Это сообщение формируется с MAIL FROM:<> (RFC 5321), в поле «To» указывается отправитель исходного письма, в поле «From» — e-mail вида MAILER-DAEMON@имя сервера. Под именем сервера понимается имя хоста в Интернет, который сгенерировал уведомление. MAIL FROM:<> позволяет защитить почтовые серверы от бесконечного хождения сообщений об ошибке между серверами — если сервер обнаруживает, что не может доставить письмо с пустым обратным адресом, то он уничтожает его. Сообщение о невозможности доставки также может формироваться через некоторое время. Это происходит в случае, если обнаруженная проблема определяется, как временная, но истекает время нахождения сообщения в очереди (RFC 5321, раздел 4.5.4.1. Sending Strategy). Если сеть имеет различные DNS-серверы (например, внешние — в Интернете и локальные — в собственных пределах), то возможна ситуация, когда «внутренние» DNS-серверы в качестве наиболее приоритетного получателя указывают на недоступный в Интернете сервер, куда и перенаправляется почта с релея, указанного как узел-получатель для Интернета. Подобное разделение позволяет осуществлять маршрутизацию почты по общим правилам между серверами, не имеющими выхода в Интернет. Протоколы получения После попадания почты на конечный сервер он осуществляет временное или постоянное хранение принятой почты. Существует две различные модели работы с почтой: концепция почтового хранилища (ящика) и почтового терминала. POP3 В концепции почтового хранилища почта на сервере хранится временно, в ограниченном объёме (аналогично почтовому ящику для бумажной почты), а пользователь периодически обращается к ящику и «забирает» письма (то есть почтовый клиент скачивает копию письма к себе и удаляет оригинал из почтового ящика). На основании этой концепции действует протокол POP3. IMAP Концепция почтового терминала подразумевает, что вся корреспонденция, связанная с почтовым ящиком (включая копии отправленных писем), хранится на сервере, а пользователь обращается к хранилищу (иногда его по традиции также называют «почтовым ящиком») для просмотра корреспонденции (как новой, так и архива) и написания новых писем (включая ответы на другие письма). На этом принципе действует протокол IMAP и большинство веб-интерфейсов бесплатных почтовых служб. Подобное хранение почтовой переписки требует значительно бо́льших мощностей от почтовых серверов, в результате во многих случаях происходит разделение между почтовыми серверами, пересылающими почту, и серверами хранения писем. Различия Основываясь на работе протоколов, можно разделить их по двум основным критериям: производительность сервера — в этом отношении IMAP более требователен к ресурсам, нежели POP3, так как вся работа по обработке почты (такая как поиск) ложится на плечи сервера, POP3 только передаёт почту клиенту; пропускная способность канала — здесь IMAP в выигрыше: POP3 передаёт тела всех писем целиком, тогда как IMAP может передавать отдельные части сообщений, например только текстовую, а остальное — по запросу. В определённых условиях сервер хранения писем может быть настроен на поведение, подобное клиенту: такой сервер обращается к почтовому серверу по протоколу POP3 и забирает почту себе. Подобные решения используются обычно в малых организациях, в которых нет инфраструктуры для развёртывания полноценных почтовых серверов; в этом случае используется локальный сервер для хранения почты и почтовый сервер провайдера, предоставляющий услугу получения почты по POP3 (например, с помощью fetchmail). Основным недостатком подобного решения является задержка в доставке (так как забирающее почту ПО обращается на серверы с некоторой задержкой) — например, POP3 connector из Exchange 2003 Server в составе Windows SBS не позволяет через интерфейс конфигурирования выставить интервал менее 15 минут, так как чрезмерная частота проверок способна вызвать проблемы с нагрузкой на почтовый сервер. Некоторые почтовые серверы имеют средства для защиты от подобного поведения. Структура письма При передаче по протоколу SMTP электронное письмо состоит из следующих частей. Данные SMTP-конверта, полученные сервером. Часть этих данных может отсутствовать в самом сообщении. Так, например, в RCPT TO (envelope to) содержится список получателей письма, при этом в самом письме получатель может быть не указан. Эта информация передаётся за пределы сервера только в рамках протокола SMTP, и смена протокола при доставке почты (например, на узле-получателе в ходе внутренней маршрутизации) может приводить к потере этой информации. В большинстве случаев эта информация недоступна конечному получателю, который использует не-SMTP-протоколы (POP3, IMAP) для доступа к почтовому ящику. Для возможности контролировать работоспособность системы эта информация обычно сохраняется в журналах почтовых серверов. Само сообщение (в терминологии протокола SMTP — 'DATA'), которое, в свою очередь, состоит из следующих частей, разделённых пустой строкой: заголовки () письма — в них указывается служебная информация и пометки почтовых серверов, через которые прошло письмо, пометки о приоритете, указание на адрес и имя отправителя и получателя письма, тема письма и другая информация; тело () письма — в нём находится собственно сообщение письма. Данные SMTP-конверта Данные SMTP-конверта содержат в себе параметры, которые задаются одноимёнными командами: Параметр HELO/EHLO — содержит имя (FQDN) отправляющего узла, либо адрес-литерал отправляющего узла. Параметр MAIL FROM — содержит e-mail отправителя. Адрес может быть произвольным (в том числе несуществующим, что допускается протоколом SMTP; однако RFC 5321 содержит рекомендацию использовать или Null Reverse-Path для специальных сообщений, или существующий e-mail), но именно это значение используется для формирования уведомлений об ошибках доставки сообщений (а не значение из поля From заголовка сообщения). Этот адрес, так же, может проверяться при первичной проверке на спам и в иных случаях. При отправке сообщения обычный почтовый клиент формирует MAIL FROM из содержимого поля From. Параметр RCPT TO — наиболее важное содержимое конверта для доставки почты, содержит электронный адрес одного или нескольких получателей. При формировании SMTP-конверта RCPT TO может использоваться несколько раз. При отправке сообщения обычный почтовый клиент формирует список для RCPT TO из содержимого полей сообщения To, Cc и Bcc. Заголовки письма Заголовки письма описываются стандартами RFC: RFC 2076 — Common Internet Message Headers (общепринятые стандарты заголовков сообщений), включает в себя информацию из других RFC: RFC 822, RFC 1036, RFC 1123, RFC 1327, RFC 1496, RFC 1521, RFC 1766, RFC 1806, RFC 1864, RFC 1911). RFC 4021 — Registration of Mail and MIME Header Fields (регистрация почты и поля заголовков MIME). Заголовки отделяются от тела письма пустой строкой. Заголовки используются для журналирования прохождения письма и служебных пометок (иногда их называют кладжами). В Microsoft Outlook эти заголовки называются «Заголовки Интернет». В заголовках обычно указываются: почтовые серверы, через которые прошло письмо (каждый почтовый сервер добавляет информацию о том, от кого он получил это письмо), информацию о том, похоже ли это письмо на спам, информацию о проверке антивирусами, уровень срочности письма (может меняться почтовыми серверами). Также в заголовке обычно пишется программа, с помощью которой было создано письмо. Поскольку заголовки являются служебной информацией, то чаще всего почтовые клиенты скрывают их от пользователя при обычном чтении писем, но также предоставляют возможность увидеть эти заголовки, если возникает потребность в более детальном анализе письма. В случае, если письмо из формата SMTP конвертируется в другой формат (например, в Microsoft Exchange 2007 письма конвертируются в MAPI), то заголовки сохраняются отдельно, для возможности диагностики. Заголовки обычно добавляются снизу вверх (то есть каждый раз, когда к сообщению нужно добавить заголовок, он дописывается первой строкой, перед всеми предыдущими). Помимо служебной информации, заголовки письма также хранят и показываемую пользователю информацию, это обычно отправитель письма, получатель, тема и дата отправки. Заголовки сообщения могут содержать только 7-битные символы. При необходимости использовать национальные символы в каких-то полях требуется использование кодировок. Как правило, это Base64 или Quoted-Printable. Часто используемые заголовки Return-Path: (RFC 821, RFC 1123) — адрес возврата в случае неудачи, когда невозможно доставить письмо по адресу назначения. Может отличаться от MAIL FROM и заголовков From:, Sender: или Reply-To:, но обычно совпадает с MAIL FROM. Received: (RFC 822, RFC 1123) — данные о прохождении письма через каждый конкретный почтовый сервер (MTA). При прохождении через несколько почтовых серверов (обычная ситуация), новые заголовки дописываются над предыдущими, в конечном итоге журнал перемещения будет записан в обратном порядке (от ближайшего к получателю узла к самому дальнему). MIME-Version: (RFC 1521) — версия MIME, с которым это сообщение создано. Зачастую этот заголовок создаётся раньше всех остальных, поэтому он обычно самый первый (то есть последний в списке). From: (RFC 822, RFC 1123, RFC 1036) — имя и адрес отправителя (именно в этом заголовке появляется текстовое поле с именем отправителя). Может не совпадать с return-path и даже не совпадать с заголовком SMTP MAIL FROM:. Sender: (RFC 822, RFC 1123) — отправитель письма. Добавлено для возможности указать, что письмо от чьего-то имени (from) отправлено другой персоной (например, секретарём от имени начальника). Некоторые почтовые клиенты показывают сообщение при наличии sender и from как «сообщение от 'sender' от имени 'from'». Sender является информационным заголовком (и также может отличаться от заголовка SMTP MAIL FROM). To: (RFC 822, RFC 1123) — имя и адрес получателя. Может содержаться несколько раз (если письмо адресовано нескольким получателям). На основании этого поля формируется содержимое поля SMTP RCPT TO. Cc: (RFC 822, RFC 1123) — (от ) содержит имена и адреса вторичных получателей письма, к которым направляется копия. Участвует в формировании поля SMTP RCPT TO, как и поле «To». Bcc: (RFC 822, RFC 1123) — (от ) содержит имена и адреса получателей письма, чьи адреса не следует показывать другим получателям. Участвует в формировании поля SMTP RCPT TO, как поля «To» и «Cc», но отсутствует в отправляемом сообщении. Reply-To: (RFC 822, RFC 1036) — имя и адрес, куда следует адресовать ответы на это письмо. Если, например, письмо рассылается роботом, то в качестве Reply-To будет указан адрес почтового ящика, готового принять ответ на письмо. Message-ID: (RFC 822, RFC 1036) — уникальный идентификатор сообщения. Состоит из адреса узла-отправителя и номера (уникального в пределах узла). Алгоритм генерации уникального номера зависит от сервера/клиента. Выглядит примерно так: AAB77AA2175ADD4BACECE2A49988705C0C93BB7B4A@example.com. Вместе с другими идентификаторами используется для поиска прохождения конкретного сообщения по журналам почтовой системы (почтовые системы фиксируют прохождение письма по его Message-ID) и для указания на письмо из других писем (используется для группировки и построения цепочек писем). Обычно создаётся почтовым клиентом (MUA) в момент составления письма. In-Reply-To: (RFC 822) — указывает на Message-ID, для которого это письмо является ответом (с помощью этого почтовые клиенты могут легко выстраивать цепочку переписки — каждый новый ответ содержит Message-ID для предыдущего сообщения). Subject: (RFC 822, RFC 1036) — тема письма. Date: (RFC 822, RFC 1123, RFC 1036) — дата отправки письма. Content-Type: (RFC 1049, RFC 1123, RFC 1521, RFC 1766) — тип содержимого письма (HTML, RTF, Plain text) и кодировка, в которой создано письмо (см. ниже про кодировки). Return-Receipt-To: (RFC 2076) — e-mail, куда почтовый сервер получателя должен отправить уведомление о доставке. В RFC 2076 упоминается в разделе «Not Internet standard», в силу этого может не поддерживаться серверами. Disposition-Notification-To: (RFC 3798) — e-mail, куда почтовый клиент получателя должен отправить уведомление о доставке, если это разрешит пользователь (посредством настроек и т. п.). Помимо стандартных, почтовые клиенты, серверы и роботы обработки почты могут добавлять свои собственные заголовки, начинающиеся с «X-» (например: X-Mailer, X-MyServer-Note-OK или X-Spamassasin-Level). Тело письма Тело письма отделяется от заголовка пустой строкой. В не-smtp стандартах формат письма зависит от стандарта системы (например, MAPI), но перед «выходом» письма за пределы MAPI-совместимой системы (например, перед пересылкой через Интернет) обычно приводится к SMTP-совместимому виду (иначе маршрутизация письма была бы невозможной, так как стандартом передачи почты в Интернете является SMTP). В теле сообщения допускаются только печатные символы. Потому для целей передачи бинарной информации (картинок, исполняемых файлов и т. п.) применяются кодировки, приводящие данные к 7-битному виду — Base64 или UUE. Кроме того, в самом начале существования e-mail ограничение было более жёстким — некоторые почтовые системы поддерживали только 7-битные сообщения. С целью работы с такими системами обычный текст, при наличии национальных символов, так же, может кодироваться в 7-битный вид. Для этого используются Base64 или Quoted-Printable. Однако почтовые системы, которые могут работать только с 7-битными сообщениями, сейчас вряд ли существуют. Цепочки писем Благодаря наличию в письме уникального идентификатора, а также тому, что подавляющее большинство почтовых клиентов при ответе на письмо копируют его идентификатор в поле In-Reply-To («в ответ на»), появляется возможность достоверной группировки писем по цепочке (). В разных почтовых клиентах это реализовано по-разному. Например, Microsoft Outlook позволяет найти все связанные с заданным письма, а веб-интерфейс GMail группирует сообщения на основании данных о цепочке в единый объект. Некоторые почтовые клиенты (например, mutt) позволяют структурировать цепочки (образующиеся обычно в почтовых рассылках, когда в беседе участвует много подписчиков) в форме дерева (вопрос породил несколько ответов, на каждый из которых дали комментарий — это сформировало несколько ветвей дерева). Также такие клиенты обычно умеют принудительно резать цепочки при смене темы сообщения (считая, что смена темы сообщения означает новое обсуждение, хотя, быть может, и вызванное предыдущей беседой). Шифрование почты Для шифрования почты в настоящий момент широко применяются два стандарта: S/MIME (использующий инфраструктуру открытых ключей) и OpenPGP (использующий сертификаты со схемой доверия, группирующегося вокруг пользователя). Ранее также существовали стандарты MOSS и PEM, но, из-за несовместимости друг с другом и неудобства использования, они не прижились. Стандарты S/MIME и OpenPGP позволяют обеспечить три вида защиты: защиту от изменения, неотзывную подпись и конфиденциальность (шифрование). Дополнительно, S/MIME третьей версии позволяет использовать защищённое квитирование (при котором квитанция о получении письма может быть сгенерирована успешно только в том случае, когда письмо дошло до получателя в неизменном виде). Оба стандарта используют симметричные криптоалгоритмы для шифрования тела письма, а симметричный ключ шифруют с использованием открытого ключа получателя. Если письмо адресуется группе лиц, то симметричный ключ шифруется по очереди каждым из открытых ключей получателей (и иногда, для удобства, открытым ключом отправителя, чтобы он имел возможность прочитать отправленное им письмо). Коммерческое использование В настоящий момент существуют следующие модели коммерческого применения почтовых систем: Домашние и корпоративные почтовые системы — функционируют на собственном или арендованном оборудовании владельца почтовой системы (обычно он же является и владельцем домена, в котором работает почтовый сервер). Услуга приёма/отправки электронной почты осуществляется сторонней организацией. Организация (персона) владеет доменом и самостоятельно хранит архив переписки. Услуги приёма/отправки и хранения почты осуществляет сторонняя организация на своих мощностях. Заказчик получает доступ к системе исполнителя для отправки писем и для доступа к архиву писем. Почтовый домен при этом находится в собственности заказчика. Приём, отправка, хранение писем осуществляет исполнитель, почтовый домен принадлежит исполнителю. Большинство подобных сервисов бесплатны и работают за счёт показа рекламы пользователю или являются бесплатным дополнением к другим сервисам исполнителя (подробнее см.: Бесплатные почтовые сервисы). Почтовые рассылки Почтовая система позволяет организовать сложные системы, основанные на пересылке почты от одного ко многим абонентам, это: Почтовые рассылки — письмо от одного адреса с одинаковым (или меняющимся по шаблону) содержимым, рассылаемое подписчикам рассылки. Технически может быть организовано как отправка множества писем (используется при шаблонных письмах) или как отправка письма со множеством получателей (в полях TO, CC, BCC). Для управления крупными почтовыми рассылками (более 10—50 абонентов) используются специализированные программы (например, mailman). Правильно организованная почтовая рассылка должна контролировать возврат писем (сообщения о невозможности доставить письмо) с исключением недоступных адресатов из списка рассылки, позволять подписчикам отписываться от рассылок. Нежелательные почтовые рассылки называются спамом и существенно осложняют функционирование почтовых систем. Группы переписки — специализированный тип почтовой рассылки, в которой письмо на адрес группы (обычный почтовый адрес, обработкой почты которого занимается специализированная программа) рассылается всем участникам группы. Является аналогом новостных конференций, эхоконференций. Правильно настроенная почтовая рассылка должна контролировать циклы (два робота рассылок, подписанные друг на друга способны создать бесконечный цикл пересылки писем), ограничивать список участников рассылки, имеющих право на помещение сообщения, выполнять прочие требования к почтовой рассылке. Для управления почтовыми рассылками используются менеджеры почтовых рассылок. Помимо ведения списка адресов и выполнения отсылки заданного сообщения, они обеспечивают фильтрацию писем, возможности премодерации писем перед помещением в рассылку, ведение архивов, управление подпиской/отпиской, рассылку дайджестов (краткого содержимого) вместо всего объёма рассылки. Примеры программ управления рассылками: mailman; Sympa; Majordomo. Спам Спам — разновидность почтовой рассылки с целью рекламы (часто нежелательной) того или иного товара или услуги, аналог бумажной рекламы, бесплатно распространяемой по почтовым ящикам жилых домов. По мере роста популярности электронной почты, она (наравне с новостными группами usenet), начала использоваться для рассылки незапрошенных рекламных сообщений, аналогично тому, как раскидываются рекламные брошюры в обычные почтовые ящики. Однако, в отличие от существенной стоимости бумажной рассылки, отправка значительного количества (миллионов и миллиардов) сообщений практически ничего не стоит отправителю. Это привело к непропорциональному росту количества и размера рекламных рассылок (по некоторым данным, спам в настоящее время составляет 70—90 % от всех почтовых сообщений, то есть превысил объём полезной почтовой нагрузки в 2—10 раз). Для рассылки спама в настоящий момент активно используются все возможные технические ухищрения: открытые релеи, ремейлеры, прокси-серверы, бесплатные серверы электронной почты (допускающие автоматизацию отправки почты), ботнеты, поддельные сообщения о невозможности доставки. По мере ужесточения запрета на размещение рекламы, сообщения разделились на легитимные рассылки (на которые обычно подписывается пользователь и от которых он может отказаться в любой момент) и нелегитимные (собственно, и называемые спамом). Для борьбы со спамом были разработаны различные механизмы (чёрные списки отправителей, серые списки, требующие повторного обращения почтового сервера для отправки, контекстные фильтры). Одним из последствий внедрения средств борьбы со спамом стала вероятность «ошибочно положительного» решения относительно спама, то есть часть писем, не являющихся спамом, стала помечаться как спам. В случае агрессивной антиспам-политики (уничтожение писем, кажущихся спамом, в автоматическом режиме без уведомления отправителя/получателя) это приводит к трудно обнаруживаемым проблемам с прохождением почты. Законодательное регулирование в России Федеральный закон No 152-ФЗ «О персональных данных». Популярнейшие сервисы электронной почты Большинство популярных сервисов электронной почты предоставляется IT-компаниями вместе с другими веб-продуктами: поисковыми системами, облачными хранилищами данных и т. д. Популярнейшие русскоязычные сервисы электронной почты разработаны компаниями Google (Gmail), Яндекс (Яндекс.Почта), Mail.ru (Mail.ru), Microsoft (Hotmail и Outlook). См. также @ Веб-почта Система мгновенного обмена сообщениями Персональные данные Примечания Ссылки RFC 822 — Standard for ARPA Internet Text Messages RFC 2142 — Mailbox Names for Common Services, Roles and Functions RFC 2368 — The mailto URL scheme RFC 5322 — Internet Message Format RFC 2045 — Format of Internet Message Bodies


source: wikipedia

text: BBS ([], — электронная доска объявлений) — широко использовавшийся в эпоху веб 1.0 способ общения пользователей компьютеров через коммутируемые телефонные сети. Оператор, обеспечивающий обслуживание станции и ее администрирование — системный оператор (жарг. сисоп, от ). Распространенные названия для BBS среди русскоязычных пользователей: , , . Среди системных операторов распространено название или (последнее чаще относилось к системе с установленным на ней FTN-обеспечением помимо BBS). Изначально BBS содержали разнообразные фирмы и доступ к ним был платный. Впоследствии же, в качестве хобби, их стали открывать и частные лица. В основной своей массе доступ к частным BBS - бесплатный. Технологии BBS могли быть как автономными, так и связанными с другими BBS (обычно через Фидонет). Для доступа к BBS необходимы телефонная сеть, модем и программа-терминал (minicom, Y-term, , Telix, Hyper Terminal, Terminate, Telemax и другие). Некоторые BBS доступны также (или исключительно) через Интернет по протоколу telnet. Пользователь BBS запускает программу-терминал, инициирует в этой программе телефонный звонок на номер BBS, после соединения BBS предлагает авторизоваться (ввести логин и пароль) либо зарегистрироваться как новому пользователю и после успешного логина пользователя предоставляет ему доступ: к «доске объявлений», где каждый или избранные могут публиковать новости и объявления (с этой функции и начинались BBS); к тематическим конференциям (подобно современным веб-форумам), с развитием BBS конференции распространялись между BBS по сети Фидонет и стали называться эхоконференциями; к каталогам обмена файлами, каждый файл сопровождается описанием и счётчиком скачиваний, для пользователей может учитываться рейтинг загрузок/скачиваний. В дополнение к онлайновому доступу к конференциям были разработаны способы оффлайнового чтения конференций с помощью и . Пользователь соединялся с BBS, скачивал на свой компьютер файл-пакет с сообщениями, отсоединялся. Читал сообщения, писал ответные и новые сообщения в конференции, которые затем программой QWK или Blue Wave собирались в пакет. В наиболее свободное время работы BBS пользователь снова соединялся с BBS, закачивал на неё пакет со своими сообщениями и скачивал пакет с сообщениями, которые оставили на BBS другие пользователи за время, прошедшее с его предыдущего звонка на BBS. Для организации BBS необходимо специальное программное обеспечение. Представление Работа с большинством BBS производится с помощью терминальной программы в текстовом режиме. Могут использоваться режимы «простой текст» (8-битные символы без цветовых кодов и очистки экрана), ANSI (текстовое расширение ASCII с возможностью цветового выделения, позволяющий создавать псевдографические рисунки) и (более эффективный двоичный протокол с возможностью передачи растровой графики). Для улучшения восприятия и оформления на BBS помимо текста широко использовались рисунки, выполненные посредством ANSI-графики. Кроме чисто прикладных функций (обмен файлами, сообщениями — см. «Типичные функции BBS») немаловажен был эстетический фактор: со вкусом оформленная и с хорошим наполнением BBS привлекала больше пользователей. Обмен впечатлениями от оформления и обсуждение посещенных BBS было нередким в локальных экохонференциях, эхоконференциях Fido и альтернативных сетей. Позже был разработан протокол , поддерживающий векторную графику и указательные устройства ввода, не получивший широкого распространения на территории Российской Федерации. Официальный редактор RIPscrip был платным, а вскоре BBS уступили популярность Всемирной паутине с HTML. Типичные функции BBS Файловые архивы (на модемных BBS обычно файлы сначала выбираются из найденных поиском [по имени или описанию, иногда поддерживаются маски] или через список, а потом скачиваются) Объявления (могут показываться, например, при входе) Эхоконференции (аналог в Интернете — форумы и конференции usenet, чтение или отправка сообщений с пойнт-адреса BBS, как правило единый адрес) Электронная почта Чат с сисопом Чат с другими пользователями на многолинейных BBS — возможность общаться с другими подключёнными пользователями в режиме реального времени (аналог в Интернете — Instant Messenger, IRC); Игры — однопользовательские и многопользовательские, в том числе с единой вселенной на нескольких BBS. На некоторых BBS игры способны изменять различные лимиты (см. уровни доступа) в зависимости от результатов. Пример игровой BBS: LORD BBS Уровни доступа У каждого зарегистрированного пользователя на BBS может быть установлен уровень доступа, как правило от twit (самый нижний уровень, при котором доступ вообще закрыт) до SySop (с полными правами). В зависимости от этого уровня может варьироваться суточное время доступа к станции и лимит времени на сессию, лимит на скачивание файлов (суточный и сессионный), возможность создания сообщений и привилегии в различных почтовых областях и группах почтовых областей, режим использования чата с системным оператором и т. п. Уровни доступа и привилегии реализуется различными механизмами в зависимости от используемого программного обеспечения BBS. Так, Maxumus использует символьные обозначения уровней доступа («twit», «limited», «normal» и др.), а в RemoteAccess уровень доступа задается 16-битным беззнаковым числом. Помимо этого, реализована система контроля и управления пользовательскими флажками, представляющими собой набор из 32 логических переменных для каждого пользователя. Система флажков позволяет менять степень взаимодействия пользователей даже одного числового уровня доступа, например, при сохранении единых временных лимитов, привилегированным пользователям может быть предоставлен доступ к скрытым пунктам меню, почтовым и файловым областям и расширенные права работы в них. Система IN-MENU наследует механизм уровней доступа RemoteAccess, предоставляя дополнительно возможность выполнить индивидуальный скрипт для каждого пользователя или группы. Tornado BBS поддерживает числовой уровень доступа и систему флажков, задаваемых строкой латинских символов, поэтому их может быть 25 — по числу букв латинского алфавита. Программное обеспечение для организации BBS Под организацией BBS подразумевается процесс создания, функционирования и обслуживания станции. Крайне редко программное обеспечение для организации BBS представляет собой программу из одного исполняемого файла. В большинстве случаев используется комплекс связанного ПО: собственно программа по обеспечению коммуникации через канал связи и предоставления пользователям доступа к интерфейсу BBS; утилиты настройки и конфигурирования параметров станции, языковых файлов, станционных меню; утилиты по обработке файловой и почтовых баз; утилиты по обслуживанию базы учётных записей; индексаторы нодлистов и пр. К примеру, в базовую поставку RemoteAccess BBS входит 7 дополнительных программ. Для распространенных систем BBS существует множество (тысячи) дополнительных утилит и онлайн-модулей (так называемые , созданных пользователями. Примечательные BBS США Valve Software BBS 4258225251 РФ Москва White Bear BBS, 2:5020/22 — первая многолинейная BBS в Москве, принадлежавшая ЗАО МКЦ «Вариант». Позже преобразована в интернет-провайдера DEOL. InfoScience BBS, 2:5020/238 — имела около 14 линий с межлинейным чатом. Находилась в Министерстве науки РФ. Украина Киев Neon_#2 2:463/877 570-57-80 20:30-06:30 bbs.ncc.org.ua — Tornado Infohelp BBS 212-06-73 24h — Tornado (по состоянию на 2011 год — закрыта) Perkombank 255-86-02 CM — Maximus (по состоянию на 2011 год — закрыта) См. также WEB-BBS Фидонет Перечень BBS Перечень программного обеспечения BBS Примечания Ссылки The BBS organization (longest running bbs services site) The BBS Archives The BBS Documentary — (Video Collection) The BBS Corner BBSes.info BBS services EST. 2006 BBS-Scene.org — BBS related services The Telnet BBS Guide Список Telnet-BBS (zip) BBSfinder real time BBS lister BBSmates community and resource site BBS News site established 1996 (domain est 2004) Текстовый интерфейс


text: BeOS — операционная система, история которой начинается в 1991 году. Изначально разрабатывалась как базовая ОС для BeBox. К выгодным отличиям BeOS от других популярных в то время систем относят многопоточность, микроядерность, поддержку многопроцессорных архитектур, 64-битную журналируемую файловую систему, крайне удобный и простой пользовательский интерфейс. В настоящее время энтузиасты создали операционную систему Haiku с открытым исходным кодом для замены BeOS. История Создание компании Be Inc. Корпорация Be Inc. была создана в 1990 году бывшим исполнительным директором Apple Жаном-Луи Гассье с целью создать компьютерную систему нового поколения (заметим, что Гассье пошёл по пути основателя Apple Стива Джобса и его платформы NeXT). На подъёме энтузиазма Гассье и его соратники объединились, чтобы сделать простой в использовании, надёжный компьютер, свободный от пережитков прошлого. Планировалось создать именно компьютер, операционная система была только побочной целью. Например, файловая система не должна была содержать каталогов вообще, все файлы лежали на диске без распределения по каталогам, а принадлежность к той или иной программе определялась на основе атрибутов — информации о файле, не записанной в самом файле. BeBox Первые версии BeOS работали только на специально созданных компьютерах BeBox, которые тоже производились компанией Be Inc. Отличительными особенностями этих компьютеров были многопроцессорность (в одной из версий компьютера стояло 7 процессоров, в другой — 2), в двухпроцессорной версии — индикаторы загрузки процессоров на передней панели системного блока (известные также под названием Blinkenlights), тёмно-синий цвет системного блока и 37-битный порт на задней панели, известный под названием «GeekPort», с простым и удобным управлением для программиста — чтобы поощрять создание внешних устройств под BeOS. BeBox назывались «Silicon Graphics для нищих» из-за их мощности, позволяющей использовать BeBox в качестве графической рабочей станции при относительно невысокой стоимости. Первые прототипы BeBox строились на процессорах , пока их не сняли с производства. Тогда Ве решила перейти на процессоры PowerPC. С 1995 до 1997 всего было продано около двух тысяч компьютеров BeBox, большинство из которых работают и по сей день. Один из них можно увидеть в компьютерном музее в Бостоне. 30 января 1997 Be Inc. объявила, что сворачивает производство оборудования, и BeBox больше не выпускались. PowerPC После того как было свёрнуто производство BeBox, операционной системе BeOS понадобилась новая платформа. Поскольку она к тому времени уже работала на PowerPC, в качестве новой платформы были выбраны компьютеры Macintosh фирмы Apple Computer, Inc. Портирование BeOS на Macintosh заняло два дня. К тому времени традиционная операционная система компьютеров Макинтош (System или Classic) безнадёжно устарела, а проект разработки новой, современной системы (Copland) провалился, поэтому исполнительный директор Apple Гил Амелио начал переговоры о покупке Be Inc. Переговоры сорвались, поскольку Жан-Луи Гассье просил $200 миллионов, а Apple готова была потратить не более 125. Совет директоров Apple решил, что лучше выбрать NeXTSTEP и купил NeXT в 1996 году за $429 миллионов, вернув руководство основателю компании Стиву Джобсу. Затем Apple перестала делиться с Be Inc. спецификациями своих новых компьютеров, поэтому BeOS запускается лишь на некоторых Power Macintosh (на других моделях работа возможна только в эмуляторе). В 1997 году Power Computing поставлял BeOS вместе со своей серией клонов Macintosh, которые могли по выбору пользователя грузиться в Mac OS или BeOS. Intel После неудачи с Apple Be Inc. решила перенести систему на обычные процессоры Intel, и, начиная с издания BeOS 3 (примерно 1997 г. также вышли издания 4, 4.5 и 5), эта операционная система работает на обычных IBM PC-совместимых компьютерах. Этот шаг был сделан с целью набрать группу последователей и занять свою нишу на рынке ОС. Минимальные требования для установки (не менявшиеся с тех пор) — процессор Intel Pentium, 32 мегабайта оперативной памяти, 500 мегабайтов на жёстком диске, клавиатура и мышь: последнее является системным требованием, потому что без неё в BeOS работать нельзя — в отличие от, например, Microsoft Windows, в которой без указательного устройства ввода работать трудно, но можно. Версия BeOS R5 стала последней версией BeOS, выпущенной компанией Be Inc. Впервые для широкой публики была выпущена бесплатная версия — Personal edition, которую каждый желающий мог установить на свой компьютер. Она широко распространялась в виде CD-приложений к журналам (в том числе и в России) и была выложена на сайте компании. Кроме того, было достигнуто соглашение с ведущими производителями компьютеров о предустановке BeOS в качестве второй системы, наряду с Windows. Неудачный менеджмент привёл к тому, что бесплатная версия (BeOS 5 Personal Edition) успешно конкурировала с платной (BeOS 5 Professional). Попытка Be Inc. выпустить бесплатную версию оказалась неудачной с маркетинговой точки зрения: состав бесплатного пакета был таков, что почти полностью дублировал платную и продажи последней неуклонно падали — BeOS 5 Personal Edition распространялась как Windows-программа, устанавливавшаяся в логический раздел на одном из дисков компьютера и предполагалась только для ознакомительных целей, однако включала в себя весь инструментарий, необходимый для разбивки диска, установки системы в отдельный раздел и установки загрузчика, позволявшего выбрать загрузку Windows или BeOS. Корпорация Microsoft надавила на производителей компьютеров (Hitachi, Compaq), и они отказались от предустановки двух систем на производимые машины. Малоизвестная операционная система так и не стала популярной среди пользователей. 8 сентября 2003 года Microsoft выплатила Be Inc. $23.3 миллиона по иску о нарушении антимонопольного законодательства. В 2002 году компания Be Inc. объявила себя банкротом и продала всю свою интеллектуальную собственность фирме Palm за 11 млн долларов, куда перешла также и основная часть бывших работников Be Inc. Cobalt В Palm бывшие разработчики BeOS работали над шестой версией операционной системы PalmOS для наладонников, опираясь на сделанные ещё в рамках BeOS наработки операционной системы BeIA (BeOS for Internet Appliances) для мобильных устройств. Шестая версия Palm OS, называемая PalmOS Cobalt, вышла в свет в 2004 году, однако не пошла на серийные устройства и работала только на прототипах. После разделения компании Palm на PalmOne и PalmSource, с последующим приобретением последней компанией , работы по Cobalt были прекращены, и начата разработка новой ОС для устройств Palm на базе Linux. Все права на систему сейчас принадлежат ACCESS Co., Ltd. Скорее всего, часть разработчиков BeOS приняли участие в создании Palm webOS, так как новая ОС, основанная на ядре Linux и выпущенная в 2009 году, использует ту же концепцию API-интерфейса для Web-приложений, которая впервые появилась в BeIA ещё в 2000 году. Современность Несмотря на использование передовых на время существования Be Inc. технологий, BeOS не смогла набрать достаточной массы пользователей и приложений для дальнейшего существования. В настоящее время среди нескольких проектов по возрождению BeOS наибольшие шансы на успех у Haiku team. Группа энтузиастов, среди которых несколько бывших инженеров Be Inc. пишет бинарно-совместимую с BeOS операционную систему с открытыми исходными кодами (в данный момент доступна бета-версия Haiku R1/Beta4 (2022г). Незадолго до поглощения Be Inc. Palm немецкая компания , по собственному заявлению, приобрела у Be Inc. исходные коды BeOS, однако официальный правообладатель, японская компания , опровергла эти сведения. История до сих пор остаётся тёмной. Наверняка известно только, что у yellowTab была лицензия от Be Inc. на перепродажу и модификацию BeOS. Вскоре появилась созданная yellowTab операционная система Zeta, являющаяся изменённой версией BeOS 5.1 или операционной системой, созданной на основе полученных от Be Inc. исходных кодов для BeOS нового поколения (последнее, однако, маловероятно). В начале 2005 года в Ганновере на CeBIT была показана первая версия Zeta. Zeta успешно продавалась; на середину 2005 года было продано больше 80 тыс. копий — это больше, чем было продано копий BeOS за все годы существования Be Inc. В 2006 году компания yellowTAB подверглась процедуре банкротства, и права на распространение Zeta перешли к немецкой компании , которая в 2007 году отказалась от дальнейшего распространения и поддержки Zeta из-за недостаточного объёма продаж и возможных проблем с правами на исходный код и распространение этой ОС. Cosmoe является интерфейсом для Linux, который может выполнять приложения BeOS. Cosmoe был с открытым исходным кодом. Последний релиз Cosmoe был в 2004 году. Существует также операционная система BlueEyedOS, основанная на модифицированной версии ядра Linux, которая могла выполнять приложения BeOS после их перекомпиляции. Релизы BlueEyedOS не выходят с 2003 года. BeOS R5.1d0 BeOS R5.1d0 или Dano/EXP (также известна как EXP, Dano, EXP/Dan0 или Dan0, «Подарок» в русскоязычном BeOS-сообществе) — кодовое имя сборки незавершенного релиза R5.1, утекшего из Be Inc. Дата сборки — день закрытия последней, 15 ноября 2001 года. В Dano реализованы OpenGL, новый сетевой стек (BONE), оконные украшения, XML kit, новый USB-стек, поддержка подсказок, новыx принтеров, новые шрифты, обновлённые Media kit, Interface Kit и app_server, новые драйвера (например, поддержка Adaptec U160 SCSI контроллеров и улучшенная поддержка SB128) и пр. Существует мнение, согласно которому Be Inc. двигалась в сторону открытия BeOS, в пользу чего свидетельствует замена некоторых проприетарных компонентов на открытые аналоги (замена собственного MP3-кодировщика на Lame, RSA Encryption Engine в NetPositive на OpenSSL). Продукты, использующие BeOS BeOS (и Zeta) по-прежнему используются в видеоредакторах Edirol DV-7 корпорации Roland. Цифровой рекордер Tascam SX-1 работает на сильно изменённой версии BeOS. iZ Technology продаёт 24-х канальные профессиональные цифровые аудиорекордеры RADAR 24 и RADAR V на BeOS 5. Magicbox, производитель наружных вывесок, использует BeOS в линейке Aavelin. , система для диджеев, играющих на 12′′ виниле, изначально работала на BeOS. , система для автоматизации трансляций радиостанций, использовала BeOS, а в данный момент в ней используется Haiku. Sync modular, модульный синтезатор позволяющий построить собственный синтезатор и звук. Разработан российским музыкантом-программистом в 1999. См. также Cosmoe Haiku Zeta Литература Примечания Ссылки Сообщество пользователей Haiku и BeOS BeOS News HanaSoft yellowTAB IsComputerOn Ещё один архив ПО и драйверов Bebox zone — музей BeOS magnussoft Ссылка для загрузки Haiku OS Программное обеспечение для Haiku-совместимых операционных систем BeOS R5.1d0 информация о версии Операционные системы реального времени Объектно-ориентированная операционная система


text: Delphi (Де́лфи, произносится ) — императивный, структурированный, объектно-ориентированный, высокоуровневый язык программирования со строгой статической типизацией переменных. Основная область использования — написание прикладного программного обеспечения. Этот язык программирования является диалектом языка Object Pascal. Изначально язык Object Pascal относился к несколько другому языку, который был разработан в фирме Apple в 1986 году группой Ларри Теслера. Однако, начиная с Delphi 7, в официальных документах компании Borland название Delphi стало использоваться для обозначения языка, ранее известного как Object Pascal. Целевая платформа Изначально среда разработки Delphi была предназначена исключительно для разработки приложений Microsoft Windows, затем был реализован вариант для платформ Linux (под торговой маркой Kylix), однако после выпуска в 2002 году Kylix 3 его разработка была прекращена, и вскоре было объявлено о поддержке Microsoft .NET, которая, в свою очередь, была прекращена с выходом Delphi 2007. В настоящее время, наряду с поддержкой разработки 32 и 64-разрядных программ для Windows, реализована возможность создавать приложения для Apple macOS (начиная с Embarcadero Delphi XE2), iOS (включая симулятор, начиная с XE4 посредством собственного компилятора), Google Android (начиная с Delphi XE5), а также Linux Server x64 (начиная с версии 10.2 Tokyo). Независимая, сторонняя реализация среды разработки проектом Lazarus (Free Pascal, в случае компиляции в режиме совместимости с Delphi) позволяет использовать его для создания приложений на Delphi для таких платформ, как Linux, macOS и Windows CE. Также предпринимались попытки использования языка в проектах GNU (например, Notepad GNU) и написания компилятора для GCC (GNU Pascal). Используется для написания интернет сервисов IIS. Философия и отличия от популярных прикладных языков программирования При создании языка (и здесь качественное отличие от языка C) не ставилось задачи обеспечить максимальную производительность исполняемого кода или лаконичность исходного кода для экономии оперативной памяти. Изначально язык ставил во главу угла стройность и высокую читаемость, поскольку был предназначен для обучения дисциплине программирования. Эта изначальная стройность в дальнейшем, как по мере роста аппаратных мощностей, так и в результате появления новых парадигм, упростила расширение языка новыми конструкциями. Так, сложность объектного C++, по сравнению с C, выросла весьма существенно и затруднила его изучение в качестве первого языка программирования, чего нельзя сказать об Object Pascal относительно Pascal. Ниже перечислены некоторые отличия синтаксических конструкций Delphi от семейства C-подобных языков (C/C++/Java/C#): В Delphi формальное начало любой программы чётко отличается от других участков кода и должно располагаться в определённом, единственном в рамках проекта, исходном файле с расширением dpr (тогда как другие файлы исходных текстов программы имеют расширение pas). program Project32; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; begin try { TODO -oUser -cConsole Main: Insert code here } except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. В С-подобных языках программирования в качестве входа обычно используется глобальная функция или статический метод с именем main и определённым списком параметров, причём такая функция может быть расположена в любом из файлов исходного текста проекта. В Delphi идентификаторы типов, переменных, а равно и ключевые слова читаются независимо от регистра: например, идентификатор SomeVar полностью эквивалентен somevar. Регистро-зависимые идентификаторы в начале компьютерной эпохи ускоряли процесс компиляции, и кроме того, позволяли использовать очень короткие имена, порой отличающиеся лишь регистром. И хотя к настоящему времени обе эти практики − использование нескольких идентификаторов, различающихся лишь регистром, равно как и чрезмерная их лаконичность, осуждены и не рекомендованы к применению, практически все унаследованные от С языки − C++, Java, C# − являются регистро-зависимыми, что, с одной стороны, требует достаточно большой внимательности к объявлению и использованию идентификаторов, а с другой — принуждает писать более строгий код, когда каждая переменная имеет чётко определённое имя (вариации регистра могут вызвать путаницу и ошибки). В Delphi в исходных файлах .pas (которые, как правило, и содержат основное тело программы) на уровне языковых средств введено строгое разделение на интерфейсный раздел и раздел реализации. В интерфейсной части содержатся лишь объявления типов и методов, тогда как код реализации в интерфейсной части не допускается на уровне компиляции. Подобное разделение свойственно также языкам C/C++, где в рамках культуры и парадигмы программирования вводится разделение на заголовочные и собственно файлы реализации, но подобное разделение не обеспечивается на уровне языка или компилятора. В C# и Java такое разделение утрачено вовсе − реализация метода, как правило, следует сразу же после его объявления. Инкапсуляция обеспечивается лишь принадлежностью метода к той или иной области видимости. Для просмотра одной только интерфейсной части модуля исходного кода используются специальные средства. В Delphi метод или функция чётко определяются зарезервированными для этого ключевыми словами procedure или function, тогда как в C-подобных языках различие обуславливается ключевым словом, определяющим тип возвращаемого значения: //Delphi procedure DoSomething (aParam: Integer); //не возвращает значения function Calculate (aParam1, aParam2: Integer): Integer; //возвращает целочисленный результат//C# void DoSomething(int aParam); // не возвращает значения { // code } int Calculate(int aParam1, aParam2); // возвращает целочисленный результат { // code } Тем сложнее в C#/C++ выглядят такие конструкции, как объявление типа «указатель на метод»: //C++: объявление типа pCalc, указателя на функцию-член, принимающую два целочисленных параметра и возвращающую целочисленный результат typedef int (TSomeClass::*pCalc)(int, int); В вышеуказанном примере объявление типа отличается от объявления переменной ключевым словом typedef, имя типа, pCalc, указывается в середине выражения, в скобках. //C#: объявление типа pCalc, указателя на функцию-член, принимающую два целочисленных параметра и возвращающую целочисленный результат public delegate int pCalc(int aParam1, int aParam2); В вышеуказанном примере объявление типа отличается от объявления переменной специальным ключевым словом delegate, имя типа указывается в середине выражения. //Delphi type pCalc = function(aParam1, aParam2: Integer): Integer of object; В вышеуказанном примере объявление типа отличается от объявления переменной специальным ключевым словом type, применением знака равенства (в случае переменной используется двоеточие), имя типа идёт сразу после ключевого слова. В Delphi начало и конец программного блока выделяются ключевыми словами begin и end, тогда как в C-подобных языках программирования для этих целей используются фигурные скобки: {}. Таким образом, возможно, в Delphi достигается лучшая читаемость кода для лиц с ослабленным зрением. С другой стороны, фигурные скобки могут быть более интуитивными при визуальном восприятии, выполняя функцию пиктограммы. //C# if (bVal) { //код, состоящий из нескольких инструкций } if (bVal2) /* код, состоящий из одной инструкции */; В вышеуказанном примере фигурные скобки обозначают составную инструкцию, то есть блок инструкций. Поскольку в команде ветвления для одной инструкции допускается выражение без фигурных скобок, то для условного выражения круглые скобки обязательны. В сложных условных выражениях количество вложенных скобочных конструкций может быть велико. //Delphi if bVal then begin // код, состоящий из нескольких инструкций end; if bVal2 then (* код, состоящий из одной инструкции *); В Delphi условное выражение всегда отделяется от следующей инструкции ключевым словом then, что избавляет от необходимости заключать условие в круглые скобки. В C-подобных языках в целях подобного отделения условное выражение цикла заключается в круглые скобки: while (condition) { // цикл с "предусловием" // тело цикла }; do { // тело другого цикла } while (condition2); // конец цикла с "постусловием", тело выполняется хотя бы однажды В Delphi циклы с предусловием и постусловием различаются сильнее: конец цикла с постусловием труднее принять за начало цикла с предусловием. Но порой такое различие может вызвать путаницу (необходимо помнить, что в цикле until указывается условие выхода). while condition do begin//условием продолжения цикла является истинность выражения, следующего за словом while, как C/C# //тело цикла end; repeat//начало цикла с постусловием //тело цикла until not condition2;//истинность выражения, следующего за словом until - это условие ВЫХОДА из цикла, в отличие от C/C# В Delphi операция присвоения значения переменной обозначается при помощи двоеточия со знаком равенства, :=, что является заимствованием из математической нотации. Знак равенства без двоеточия — это оператор проверки равенства, возвращающий булево значение. Напротив, в C-подобных языках оператором присваивания является одинарный знак равенства, а оператором проверки равенства — двойной, ==. В силу того, что в этих языках программирования присваивание является лишь выражением, возвращающим значение переменной слева, не так уж редки следующие неочевидные для новичка ошибки: // C++ int iVal = 12; while (iVal = 1) { // по замыслу программиста, данное тело цикла не должно выполняться, если на входе iVal имеет значение, отличное от единицы // однако, в результате ошибочной замены знака == на одиночный =, iVal будет присвоено значение 1, а цикл окажется бесконечным } В Delphi подобная ошибка невозможна хотя бы уже потому, что присваивание в этом языке — операция, не возвращающая значения. В Delphi объектное и объектно-ориентированное программирование хоть и поощряется, однако не является единственно возможным. Так, допустимо (в отличие от C#) объявление и использование глобальных или статических функций и переменных. Язык C# принудительно объектен. Глобальные, без привязки к классу, функции запрещены. Value-типы, наподобие структур struct, унаследованы от общего типа C#, несмотря на то, что сами по себе они не могут быть унаследованы (то есть, наследование структур в C# запрещено). Вместе с тем, экземпляры классов C# являются неявно-ссылочными типами, как и в Delphi. Поскольку системные вызовы в Windows (как, впрочем, и в POSIX-системах наподобие Linux, Mac OS) формально необъектны, взаимодействие C#-кода с ними затруднено даже без учёта разной парадигмы управления временем жизни переменных в памяти. Delphi не имеет подобных ограничений. Несмотря на такую акцентированную на объектность парадигму, в C# отсутствует понятие виртуального конструктора, то есть создания экземпляра класса, точный тип которого на этапе компиляции неизвестен, а известен лишь базовый класс этого экземпляра. Отчасти этот недостаток может быть скомпенсирован посредством интерфейсов или reflection, однако подобные решения не являются стандартными для языка. type TAnimal = class abstract protected FPersonalName: string; public constructor Create(const PersonalName: string); virtual; abstract; function GetSpecieName: string; virtual; abstract; // возвращает биологический вид животного property Name: string read FPersonalName; end; TAnimalClass = class of TAnimal; // метакласс, могущий ссылаться на любой класс, унаследованный от TAnimal ... function CreateAnAnimal(const FactAnimalClass: TAnimalClass; const Name: string): TAnimal; begin Result := FactAnimalClass.Create(Name); // функция не знает, животное какого именно вида будет создано, хотя "кличка" известна. Конкретная реализация вида скрыта. end; Кроме того, в отличие от C# и C++, где вызов конструктора базового класса непременно осуществляется ещё до входа в тело конструктора унаследованного класса, в Delphi этот вызов делается явно. Таким образом, его можно отложить или вовсе опустить в специальных целях. Очевидно, в отличие от C#, возможен контроль над исключениями в базовых конструкторах. Для наиболее гибкой и эффективной реализации объектно-ориентированного подхода в Delphi введены два механизма полиморфного вызова: классический виртуальный, а также динамический: если в случае классического виртуального вызова адреса всех виртуальных функций будут содержаться в таблице виртуальных методов каждого класса, то в случае с динамическим вызовом указатель на метод существует лишь в таблице того класса, в котором он был задан или перекрыт. Таким образом, для динамического вызова из класса D метода класса A, переопределённого в B, потребуется выполнить поиск в таблицах методов классов D, A и B. Подобная оптимизация имеет своей целью уменьшение размера статической памяти, занимаемой под таблицы методов. Экономия может быть существенна для длинных иерархий классов с очень большим количеством виртуальных методов. В C-подобных языках динамические полиморфные вызовы не применяются. В отличие от C#, язык Delphi допускает создание (инициализацию) экземпляра класса, содержащего абстрактные (не имеющие реализации) методы. Чтобы исключить возможность создания экземпляра класса, не достаточно объявить в нём абстрактные методы. Необходимо использовать в описании класса ключевое слово abstract. Таким образом, в настоящее время классы, имеющие абстрактные методы (в отличие от ранних реализаций Delphi), не считаются абстрактными. При помощи механизма виртуальных функций код базового класса, имеющего абстрактные методы, определяет на этапе выполнения, перекрыт ли в фактическом экземпляре класса конкретный абстрактный метод, и в зависимости от этого или вызывает перекрытый метод, или создаёт исключение EAbstractError. Также Delphi допускает перекрытие любого конкретного виртуального метода базового класса абстрактным в классе-потомке: type TMyBase = class(TObject) function A: integer; virtual; // метод A имеет реализованное тело в разделе implementation end; TMyDerived = class(TMyBase) function A: integer; override; abstract; // метод перекрыт как абстрактный, тела не имеет, // и при этом перекрывает (скрывает) реализованный в базовом классе end; procedure Test; var m: TMyBase; begin m := TMyDerived.Create; // мы создали класс с абстрактным методом m.A; // вызов A полиморфный, и мы получаем исключение типа EAbstractError, пытаясь выполнить абстрактный метод end; В отличие от C++, язык C# обладает унаследованной от Delphi концепцией свойств класса: псевдополей, которые, в ряде случаев, могут более интуитивно, по сравнению с методами, отражать, а также изменять состояние объекта. public class Date{//данный пример взят с [http://msdn.microsoft.com/en-us/library/w86s7x04.aspx msdn] private int month = 7; // Backing store public int Month{ get{ return month; } set{ if ((value > 0) && (value < 13)) { month = value; } }//set }//prop }//class Аналогичный исходный текст на языке Delphi может выглядеть следующим образом: type TDate = class private FMonth : Integer; protected procedure SetMonth(const Value: Integer); // реализация в разделе implementation public property Month: Integer read FMonth write SetMonth; end; Прежде чем перейти к сравнению языковой реализации свойств, заметим, что сопоставление этих двух примеров наглядно показывает, что язык C# провоцирует, во-первых, злоупотребление фигурными скобками (что не так страшно в виду краткости их написания), и, во-вторых, нагромождение обязательных спецификаторов доступа к каждому члену класса; в Delphi (как и в C++) однажды объявленный спецификатор применяется ко всем последующим членам. Также, если в Delphi возможна привязка свойства к значению поля, то в C# они всегда снабжаются методами доступа, с использованием скобок составной команды (кроме автоматических свойств). Методы эти, в отличие от Delphi, не могут быть объявлены виртуальными, равно как не могут быть вызваны непосредственно. Метод доступа в C# всегда относится к одному, и только к одному свойству, тогда как для Delphi это утверждение, вообще говоря, неверно. Более того, один и тот же метод может быть использован для реализации доступа к существенно различным свойствам: type TRectangle = class private FCoordinates: array[0..3] of Longint; function GetCoordinate(Index: Integer): Longint; procedure SetCoordinate(Index: Integer; Value: Longint); public property Left: Longint index 0 read GetCoordinate write SetCoordinate; property Top: Longint index 1 read GetCoordinate write SetCoordinate; property Right: Longint index 2 read GetCoordinate write SetCoordinate; property Bottom: Longint index 3 read GetCoordinate write SetCoordinate; property Coordinates[Index: Integer]: Longint read GetCoordinate write SetCoordinate; end; Как Delphi, так и C# допускают использование индексируемых свойств: в этом случае синтаксис доступа к такому свойству аналогичен доступу к элементу массива. Однако, если в Delphi число индексируемых свойств, равно как и число индексаторов, может быть произвольным, в C# индексатор применим лишь к специальному свойству по умолчанию. Кроме того, в Delphi свойство по умолчанию не только может быть индексируемым, также оно может быть перегружено по типу индексатора: TMyObject = class protected function getStr(Name: string): string; virtual; function getStrByIx(Index: Integer): string; virtual; function getBy2Indicies(X, Y: Integer): string; virtual; public property Value[Name: string]: string read getStr; default; property Value[Index: Integer]: string read getStrByIx; default; property Value[X, Y: Integer]: string read getBy2Indicies; default; //количество end; Языки Java и C# были изначально спроектированы для создания программ, работающих в управляемой среде, где управлением временем жизни объектов занимается эта среда: так что ручное управление памятью не допускается. Удобство и безопасность этого подхода отрицательно влияют на производительность. Платформы .NET и Java значительно упростили разработку программ за счёт введения «сборщика мусора», который разрешает программисту не заботиться о высвобождении памяти, занимаемой объектами, которые вышли из области видимости работающего кода программы. Это, с одной стороны, значительно уменьшило проблему так называемых «утечек памяти» (когда уже ненужные, — и недостижимые по причине утраты адреса данные занимают оперативную память), но, с другой стороны, потребовало от платформы реализовать сложный и ресурсоёмкий алгоритм «сборки мусора» — который традиционно реализован как нахождение достижимых объектов и высвобождение остальных. На практике, чтобы выполнить исчерпывающий анализ достижимости объектов, сборщик мусора в некоторые моменты времени приостанавливает работу программы (всех её потоков), что приводит к кратковременной потере отзывчивости. Частота и длительность таких остановок напрямую зависит от объёма доступной оперативной памяти (пока есть свободная память, сборщик мусора старается не проводить блокирующий анализ), а также от числа задействованных в программе объектов (таким образом, лучше иметь несколько «больших» объектов, чем много — маленьких). Ситуация ухудшается по мере роста количества задействованных в программе потоков — ведь исчерпывающий анализ достижимости требует полного останова. Таким образом, явная выгода — решение проблемы «утечек памяти» и, в целом, автоматическое управление временем жизни объектов — породила неявную проблему масштабирования и «провалов» производительности. Эта проблема малозаметна в простых программах, но по мере роста сложности и объёма кодовой базы становится всё более острой — то есть на финальном этапе разработки. Сложные программные комплексы, как правило, имеют привязку к реальному времени, так и требования к отзывчивости. Попытки снизить издержки сборки мусора могут привести к существенному искажению стиля программирования. В Delphi не существует автоматического управления памятью: (в классических компиляторах языка) экземпляры классов создаются и удаляются вручную, тогда как для некоторых типов — интерфейсов, строк и динамических массивов задействован механизм подсчёта ссылок. Ни один из этих подходов, вообще говоря, не гарантирует отсутствия утечек памяти, но, с другой стороны, проблема отзывчивости не актуальна, временные издержки управления памяти малы, и, что важнее, очевидны. Также, при отсутствии утечек, общий объём задействованной оперативной памяти существенно меньше, чем у аналогичных приложений, полагающихся на сборщик мусора. История языка Object Pascal — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а в Object Pascal — динамическую идентификацию типа данных с возможностью доступа к метаданным классов (то есть к описанию классов и их членов) в компилируемом коде, также называемую интроспекцией — данная технология получила обозначение RTTI. Так как все классы наследуют функции базового класса TObject, то любой указатель на объект можно преобразовать к нему, после чего воспользоваться методом ClassType и функцией TypeInfo, которые и обеспечат интроспекцию. Также отличительным свойством Object Pascal от C++ является то, что объекты по умолчанию располагаются в динамической памяти. Однако можно переопределить виртуальные методы NewInstance и FreeInstance класса TObject. Таким образом, абсолютно любой класс может осуществить «желание» «где хочу — там и буду лежать». Соответственно организуется и «многокучность». Object Pascal (Delphi) является результатом функционального расширения Turbo Pascal. Delphi оказал огромное влияние на создание концепции языка C# для платформы .NET. Многие его элементы и концептуальные решения вошли в состав С#. Одной из причин называют переход Андерса Хейлсберга, одного из ведущих разработчиков Дельфи, из компании Borland Ltd. в Microsoft Corp. Версия 8 способна генерировать байт-код исключительно для платформы .NET. Это первая среда, ориентированная на разработку многоязычных приложений (лишь для платформы .NET); Последующие версии (обозначаемые годами выхода, а не порядковыми номерами, как это было ранее) могут создавать как приложения Win32, так и байт-код для платформы .NET. Delphi for .NET — среда разработки Delphi, а также язык Delphi (Object Pascal), ориентированные на разработку приложений для .NET. Первая версия полноценной среды разработки Delphi для .NET — Delphi 8. Она позволяла писать приложения только для .NET. Delphi 2006 поддерживает технологию MDA с помощью ECO (Enterprise Core Objects) версии 3.0. В марте 2006 года компания Borland приняла решение о прекращении дальнейшего совершенствования интегрированных сред разработки JBuilder, Delphi и C++ Builder по причине убыточности этого направления. Планировалась продажа IDE-сектора компании. Группа сторонников свободного программного обеспечения организовала сбор средств для покупки у Borland прав на среду разработки и компилятор. Однако в ноябре того же года было принято решение отказаться от продажи IDE-бизнеса. Тем не менее разработкой IDE продуктов теперь будет заниматься новая компания — CodeGear, которая будет финансово полностью подконтрольна Borland. В августе 2006 года Borland выпустил облегчённую версию RAD Studio под именем Turbo: Turbo Delphi (для Win32 и .NET), Turbo C#, Turbo C++. В марте 2008 года было объявлено о прекращении развития этой линейки продуктов. В марте 2007 года CodeGear порадовала пользователей обновлённой линейкой продуктов Delphi 2007 for Win32 и выходом совершенно нового продукта Delphi 2007 for PHP. В июне 2007 года CodeGear представила свои планы, то есть опубликовала так называемый «roadmap». 25 августа 2008 года компания Embarcadero, новый хозяин CodeGear, опубликовала пресс-релиз на Delphi for Win32 2009. Версия привнесла множество нововведений в язык, как то: По умолчанию полная поддержка Юникода во всех частях языка, VCL и RTL; замена обращений ко всем функциям Windows API на юникодные аналоги (то есть MessageBox вызывает MessageBoxW, а не MessageBoxA). Обобщённые типы, они же generics. Анонимные методы. Новая директива компилятора $POINTERMATH [ON|OFF]. Функция Exit теперь может принимать параметры в соответствии с типом функции. Вышедшая в 2011 году версия Delphi XE2 добавила компилятор Win64 и кросс-компиляцию для операционных систем фирмы Apple (MacOS X, iOS). Вышедшая в 2013 году версия Delphi XE5 обеспечила кросс-компиляцию приложений для устройств на платформе ARM/Android. Компиляторы Embarcadero Delphi (ранее наз. CodeGear Delphi и Borland Delphi) — вероятно, наиболее известный компилятор, который является последователем Borland Pascal и Turbo Pascal. Используется Win16 (Delphi 1), Win32 (Delphi 2 и позже), Win64 (Delphi 16 (XE2) и позже), а также .NET 1.x, 2.0 (Delphi 8, Delphi 2005-Delphi 2007). Поддержка .NET впоследствии выделена в отдельный продукт, известный как (несовместимый с Delphi) Oxygene. Free Pascal (FPC) — свободный компилятор Object Pascal, который поддерживает различные диалекты Паскаля, включая Turbo Pascal (с некоторыми оговорками), Delphi и собственные диалекты. На текущий момент FPC может генерировать код для x86, x86-64, PowerPC, SPARC и процессоров ARM, а также для различных операционных систем, в том числе для Microsoft Windows, Linux, FreeBSD, Mac OS. Существует несколько сред разработки программного обеспечения для FPC (одна из самых известных представителей — Lazarus). GNU Pascal (отдельно разработанная версия из GCC). Не ставит целью продолжение серии диалектов Delphi как составляющей Паскаля, но тем не менее содержит режим совместимости с Borland Pascal, и очень медленно приспосабливает компоненты языка Delphi. Не подходит для компиляции больших проектов, содержащих код Delphi, но его поддерживает большинство операционных систем и архитектур. Oxygene (ранее известен как Chrome) — компилятор ограниченно совместимого с Delphi языка, который интегрирован в Microsoft Visual Studio. Также доступен в виде компилятора с вольной командной строкой CLI. Использует .NET и моноплатформы. Прежде продавался под маркой Embarcadero Delphi Prism. MIDletPascal — язык программирования с Delphi-подобным синтаксисом и одноимённый компилятор, который преобразует исходный код в компактный и быстрый байт-код Java. PocketStudio — основанная на Паскале IDE для Palm OS. Virtual Pascal — Бесплатный компилятор и текстовая IDE для Win32, OS/2 и Linux. На тот момент очень быстрый и весьма совместимый (частично поддерживаются конструкции Delphi 5). Внешне очень похож на текстовую среду Borland Pascal 7, хотя отсутствует совместимая с ним графика, например. Однако разработка окончилась в 2004 году, а исходники открыты не были. С тех пор FPC ушёл намного вперёд и в целом для программирования лучше он. Тем не менее VP остаётся очень неплохим вариантом быстрой замены ещё более устаревших версий Borland Pascal для школы/института, учитывая родную работу в Win32 без проблем с русскими кодировками. Синтаксис языка Система типов Система типов в Delphi строгая, статическая. Поддерживаются следующие типы данных: целочисленные, знаковые, и беззнаковые: Byte, Shortint, Word, Smallint, Cardinal,Integer, UInt64, Int64 типы-перечисления, задаваемые пользователем вещественные типы Single, Double, Extended (только x86-32, на Win64 Extended = Double), унаследованный тип Real48, работающий в режиме целочисленной эмуляции. Тип Currency вещественное фиксированной точности. строки. Тип string — автоматический распределяемый в памяти, с подсчётом ссылок и парадигмой Copy-On-Write. В поздних версиях Delphi символы двухбайтные, Unicode-совместимые. AnsiString — аналогичная реализация для строк с шириной символа в один байт. Такие строки содержат в служебном поле информацию о кодировке. В Windows компиляторах с ранних версий существует тип WideString, полностью совместимый типу BSTR в Component Object Model. Также допускается использование строк с фиксированной длиной, не превышающей 255 однобайтных символов. Допускается использование примитивных строковых типов, в стиле языка C: PChar и PWideChar массивы. Одномерные, многомерные фиксированной длины, а также подобные им динамические, с подсчётом ссылок. множества, состоящие из элементов типа-перечисления. Максимальный размер такого перечисления — 256 элементов. Записи. Структурный (value) тип без поддержки наследования. Начиная с Delphi 2006 добавлена поддержка инкапсуляции, методов, свойств. Перегрузка операторов. Начиная с Delphi 10.3 Rio добавлена возможность создавать для записи конструкторы. Классы и обобщённые классы (generics). Неявно-ссылочный тип. Поддержка инкапсуляции, наследования, полиморфизма, в том числе виртуальных конструкторов, атрибутов, обобщённых параметров для класса и отдельных методов, а также диспетчеризации методов по индексу. Класс может реализовать один или несколько интерфейсов, в том числе опосредованно, делегируя реализацию интерфейса свойству или полю. Множественное наследование не поддерживается. Указатели на функции и методы, а также указатели на анонимные функции. Типы-метаклассы, содержащие указатель на тип объекта (но не сам объект). В основном введены для реализации виртуальных конструкторов и автоматической сериализации. интерфейсы. COM-совместимые (в Windows-компиляторе), унаследованные от одного предка. Множественное наследование не поддерживается. Диспинтерфейсы, для работы с интерфейсами IDispatch в режиме позднего связывания. Variant и OleVariant — тип с динамической типизацией. Старые объекты, поддерживаемые для совместимости с Turbo Pascal. В отличие от экземпляра класса, объект может быть размещён в стеке, или статически. . Операторы Список операторов через пробел: := + — * / div mod not and or with xor shl shr ^ = <> >= <= < > @ in is as Арифметические: + — * / div mod Сложение, вычитание, умножение, деление(дающее вещественный результат), целочисленное деление, выделение остатка. По типу возвращаемого значения различаются операторы целочисленного деления (div и mod) и оператор /. Последний, применяемый как к целочисленным, так и к вещественным операндам, всегда в результате даёт вещественный тип. Оператор сложения + используется также для конкатенации строк (когда используются встроенные строковые типы). Бинарные/логические: not and or xor Инверсия(отрицание), «И», «ИЛИ», Исключающее «ИЛИ». Тип операции (бинарная или логическая) зависит от типа первого операнда. К битовым операторам целочисленных типов относятся также shl, shr — операторы сдвига, соответствующие по смыслу одноимённым командам процессоров Intel x86. Порядковые операторы(операторы сравнения)= <> > < >= <= — равенства, неравенства(соответствует оператору != в C-подобных языках), больше, меньше, не меньше, не больше — применяются ко всем порядковым и вещественным типам и возвращают значение типа boolean К операторам множества относятся + - * in — сложение, вычитание, пересечение множеств, а также оператор теста вхождения, которые используются для манипуляций со встроенным типом множества. Первые три возвращают тип множества, последний — булевый тип. type TDayOfWeek = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); //задаётся тип перечислений TDays = set of TDayOfWeek; //задаётся тип множества var day: TDayOfWeek; days: TDays; isMyDay: Boolean; begin days := [Sunday, Tuesday, Saturday]; day := Monday; isMyDay := day in days; // оператор in возвращает булевое значение, принимая первым операндом значение типа "элемент множества", а вторым — значение типа "множество" end; Операторы приведения типов — () as is — безусловное приведение, безопасное приведение объектных и интерфейсных типов, а также оператор теста принадлежности к типу(возвращает булевое значение). Безусловное(небезопасное) приведение используется в функциональном стиле(слева пишется идентификатор типа, справа в скобках приводимое к нему выражение) и применяется к порядковым, вещественным, структурным, ссылочным, строковым типам. При этом для ссылочных(включая неявно-ссылочные) типов не происходит действительного приведения, а лишь новая интерпретация тех же данных. Операторы as и is применяются к типам, допускающим полиморфное поведение — экземплярам класса и интерфейсам. Первый приводит безопасное(в смысле невозможности неверной интерпретации) приведение типа, а второй тестирует поддержку экземпляром класса или интерфейсом некоторого класса или интерфейса. Нужно помнить, что в отличие от языка C# неудавшееся приведение типа оператором as возбуждает исключение. Ссылочные операторы ^ @ — используются для работы с указателями. Оператор ^ разыменовывает указатель. Оператор @ выполняет обратное действие, возвращая адрес переменной. Поддерживается простые операции сложения и вычитания над типизированными указателями, с учётом размера типов, на которые они указывают (умная арифметика указателей). Оператор присваивания :=. В Delphi оператор присваивания, образует не выражение, а операцию, таким образом, не допускается «нанизывание» присваиваний. Классы В языке Object Pascal классы — это специальные типы данных, используемые для описания объектов. Соответственно объект, имеющий тип какого-либо класса, является экземпляром (instance) этого класса или переменной этого типа. Класс представляет собой особый тип, имеющий в своём составе такие элементы, как поля, свойства и методы. Поля класса аналогичны полям записи и служат для хранения информации об объекте. Методами называются процедуры и функции, предназначенные как правило для обработки полей. Свойства занимают промежуточное положение между полями и методами. Объектно-ориентированные особенности языка Инкапсуляция Объединение и скрытие объектных данных, а также обрабатывающих их методов, внутри конкретного класса от пользователя называется инкапсуляцией. Наследование При создании новых типов объектов способность получить все свойства и методы от своих предков называют наследованием. Такие типы объектов наследуют после своего создания все поля, свойства, события, методы и прочее от своих предков. Наследование часто избавляет разработчиков от рутинной работы и позволяет, не мешкая, приступить к разработке чего-то нового. В отличие от C++, в Delphi не допускается множественное наследование. В Delphi есть возможность добавить методы в класс или запись, с помощью так называемого помощника класса или помощника записи (class helper или record helper), который, не являясь потомком от модифицируемого класса или записи, может добавлять в них дополнительные методы. Примером может служить объявленная в модуле System.SysUtils запись-помощник TStringHelper. Полиморфизм Delphi реализует классическую модель полиморфизма, принятую в прикладных языках программирования, когда методы базового класса, а также ссылочные переменные типа базового класса,— способны манипулировать экземплярами классов-потомков на основе контракта, заданного в базовом классе. Контрактом в этом случае выступает объявление абстрактных методов в базовом классе. Примеры Структура программы Каждая написанная программа на языке Delphi состоит из заголовка программы (program NewApplication;), поля используемых модулей Uses (к примеру, Uses Windows, Messages, SysUtils и т. д.), который может не входить в саму структуру, а также блоков описания и исполнения (начинаются составным оператором begin и заканчиваются end.). program Project1; // Заголовок программы, с её именем «Project1» uses Forms, Unit1 in 'Unit1.pas' {Form1}; // модули, которые подключены к проекту и используются программой {$R *.res} begin Application.Initialize; // Инициализация приложения Application.CreateForm(TForm1, Form1); // Создание формы/окна Application.Run; // Запуск и исполнение end. Пример No 1 Вывод сообщения «Hello, world!» в консольном приложении Delphi program Helloworld; //название программы {$APPTYPE CONSOLE} //директива компилятору о создании консольного приложения begin writeln('Hello, world!'); //вывод сообщения Hello, world! readln; //ожидание нажатия клавиши пользователем end. //конец программы Пример No 2 Вывод сообщения «Hello, world!» в 32-разрядном GUI приложении Delphi ... procedure TForm1.Button1Click(Sender: TObject); //Обработчик события OnClick, генерируемый автоматически begin ShowMessage('Hello, world!'); //вывод сообщения Hello, world! end; //конец процедуры ... Пример No 3 Динамическое создание списка строк и запись его в файл. // Обработчик события, происходящего при создании формы MainForm procedure TMainForm.FormCreate(Sender: TObject); var // Объявление переменной типа TStrings (список строк). Strings: TStrings; begin // Создание (выделение памяти и заполнение её начальными значениями) объекта типа TStringList. // TStringList - это потомок TStrings, реализующий его абстрактные методы с целью хранения строк в памяти. Strings := TStringList.Create; try // Добавление строки. Strings.Add('Добавляемая строка.'); // Сохранение всех строк в файл. Strings.SaveToFile('C:\Strings.txt'); finally // Освобождение памяти объекта и очистка ссылки на неё для предотвращения непреднамеренного обращения к не выделенной памяти. FreeAndNil(Strings); end; end; Расширения файлов .pas — исходный код модуля (pascal) .dpr — исходный код проекта (pascal) .dproj — исходный код проекта (xml) .dproj.local — исходный код проекта (xml) .dfm — исходный код формы .dpk — исходный код проекта пакета .bpl — скомпилированный пакет .dcu — скомпилированный модуль .exe — скомпилированное приложение .res — ресурсы .dsk — привязки к файлам .identcache — кэшированные привязки к файлам Известное программное обеспечение, созданное на Delphi Среди многих распространённых программных продуктов, написанных на Delphi, можно найти: Продукция Embarcadero: Embarcadero Delphi, Embarcadero C++ Builder, Borland JBuilder 1 и 2 версии. Администрирование и разработка баз данных: MySQL Tools, IBExpert, Open Server. Инженерное программное обеспечение: Altium Designer, SprutCAM. Файловые менеджеры: Total Commander, Frigate, ViewFD, FreeCommander. Просмотрщики графики: FastStone Image Viewer, FuturixImager, drComRead. Редакторы графики: IcoFX. Видео- и аудиопроигрыватели: Light Alloy, The KMPlayer, AIMP, X-Amp, Nata Player. Программы мгновенного обмена сообщениями: QIP 2012, R&Q, The Bat!, PopTray, FeedDemon, MyChat, Skype (до покупки Microsoft). Клиенты файлообменных сетей: Shareman, Ares Galaxy. Создание музыки: FL Studio, Guitar Pro (до версии 6.0). Разработка программного обеспечения: Dev-C++, DUnit, Game Maker, Inno Setup, PyScripter, PE Explorer. Веб-разработка: Macromedia HomeSite, PHPEdit. Текстовые редакторы: BirEdit, Notepad GNU, Bred (до версии Bred 3), PSPad. Учёт и налогообложение: Меркурий-ERP, «Бюджет 21», «Парус», AVARDA (до версии 6.x включительно), r_keeper, Traider Alpha. Система электронной очереди «МАКСИМА». Программы хранения и обработки медицинских изображений Makhaon Worsktation, Makhaon Storage Программы для создания анимаций: Pivot Stickfigure Animator. Программы для сжатия данных: ALZip, PowerArchiver, IZArc. Нахождение и уничтожение шпионского ПО и вредоносных программ: Spybot — Search & Destroy. Компьютерные игры: Age of Wonders, «Космические рейнджеры», Космические рейнджеры HD: Революция, Venom. Codename: Outbreak, Space Empires V, «Правда о девятой роте». Лаунчер портативных программ: PortableApps. Дефрагментация диска: SmartDefrag. Различные системные утилиты: TreeSize. Терминал для работы с COM-портом: TerminalTMB. Критика Критика языка на ранних этапах развития История критики Pascal восходит к 1981 году и работе Брайана Кернигана, аргументы которой в основном устарели по мере развития языка. Нововведения для компиляции на мобильные платформы Некоторые изменения языка, осуществлённые компанией Embarcadero (разработчиком языка) в так называемых NextGen-компиляторах языка Delphi, намеренно нарушили совместимость с накопленной базой исходного кода. Эти изменения были отрицательно восприняты широким кругом опытных Delphi-разработчиков, поскольку, хотя и приближали язык к парадигме языков .NET, но сломали традицию высокой обратной совместимости и существенно затруднили перенос имеющегося исходного кода в программное обеспечение для мобильных платформ. Указанные ниже изменения поставили под сомнение самую парадигму мультиплатформенной разработки на базе единого исходного кода, рекламируемую Embarcadero. введение индексации строк по нулевой базе Со времён Pascal исторически сложилось, что встроенный строковый тип индексировался с базой в единицу: «нулевой» элемент строки возвращал длину строки. По мере введения новых («длинных» и «юникодных») строковых типов данный порядок индексации сохранялся, обеспечивая почти бесшовный перенос кодовой базы на обновлённые версии языка. Однако со введением nextgen-компиляции парадигма изменилась: в новых компиляторах строки стали индексироваться по нулевой базе, как и в семействе С-подобных языков (C++, C#, Java), при этом в «классических» компиляторах для Windows и Mac OS парадигма единичной индексации была сохранена. введение безальтернативного механизма подсчёта ссылок для экземпляров классов Исторически классы и их экземпляры являются неявно-ссылочными структурными типами. Тем не менее, управление временем жизни экземпляра класса изначально выполнялось вручную — посредством явного вызова конструктора и деструктора (либо метода Free()), и такая особенность сохраняется (по состоянию на 2018 год) в классических версиях компиляторов. Подсчёт ссылок работал лишь для классов, реализующих интерфейсы, и притом, в том только случае, когда манипуляции с такими классами производились посредством переменных интерфейсного типа. До версии 10.4 компиляторы для мобильных платформ ввели подсчёт ссылок для всех экземпляров классов, тем самым в корне изменив парадигму управлением временем жизни объектов, поскольку «ручное» управление практически (за исключением некоторых весьма продвинутых техник) несовместимо с новой парадигмой. С версии 10.4 введен единый механизм управления памятью, когда для мобильных, настольных и серверных используется классическая реализация управления памятью объектов. ARC-модель управления памятью model осталась для управления строками и ссылками на тип интерфейса на всех платформах. Медленная эволюция языковых средств Многие разработчики рассматривают консервативность Delphi как достоинство, которое обеспечивает высокую переносимость кода, а также упрощает понимание языка начинающими программистами. Однако в настоящее время ситуация такова, что новые технологии, парадигмы и даже языки программирования появляются (и набирают популярность) едва ли не каждый год. Развитие же языковых средств не всегда влечёт за собой отказ от обратной совместимости. Ярким примером такого подхода является До версии компилятора 33.0 (Delphi 10.3 Rio) объявление локальной переменной должно было предшествовать первой инструкции кода функции, причём инициализация локальных (стековых) переменных в месте объявления не допускается. Невозможен был также и вывод типа. Для сравнения, объявление локальной переменной в любом месте функции поддерживалось в языке Си изначально, и было унаследовано практически всеми языками, которые придерживались Си-подобного стиля — C++, C#, Java и др. Введение этого языкового средства в Delphi обсуждалось давно, но в то время не встретило понимания разработчиков языка. В то же время объявление локальных переменных внутри блока, кроме операций цикла For, может привести к усложнению читаемости кода больших проектов. Примечания Литература Ссылки Домашняя страница среды программирования Delphi на сайте Embarcadero Technologies Delphi