Previous Entry | Next Entry
Статья на тему различных методов установки wxWidgets на разных платформах откладывается на неопределённое время. Вместо неё решил пока написать коротенькую заметку о том, как быстро подготовить компьютер с ОС Windows для программирования с использованием wx (на альтернативных операционках всё проще, например во FreeBSD достаточно дать команду cd /usr/ports/devel/codeblocks/ && make install clean и подождать, пока соберётся CodeBlocks, wxWidgets, GTK+, X11 и так далее =)).October 2018 | ||||||
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
Powered by LiveJournal.com
Rich Turner
15 ноября 2018 г. 1 0
В этом посте мы обсудим улучшения, которые мы вносим во внутренний текстовый буфер консоли Windows, позволяя ему лучше хранить и обрабатывать текст Unicode и UTF-8.
Этот список будет обновляться по мере публикации новых сообщений:
[Источник: Дэвид Фаррелл, «Создание кодировщика UTF-8 в Perl»]
Наиболее заметным аспектом терминала командной строки является то, что он отображает текст, выдаваемый вашей оболочкой и/или инструментами командной строки. и приложения в сетке моноширинных ячеек — по одной ячейке на символ/символ/глиф. Отлично, это просто. Как это может быть сложно, ведь это всего лишь буквы? Неееет! Читай дальше!
Текст есть текст есть текст. Или это?
Если вы говорите на языке, возникшем в Западной Европе (например, на английском, французском, немецком, испанском и т. д.), скорее всего, ваш письменный алфавит довольно однороден — 10 цифр, 26 отдельных букв — заглавные и строчные. case = всего 62 символа. Теперь добавьте около 30 символов пунктуации, всего вам понадобится около 95 символов. Но если вы из Восточной Азии (например, китайцы, японцы, корейцы, вьетнамцы и т. д.), вы, скорее всего, будете читать и писать текст с еще несколькими символами… всего более 7000!
Учитывая эту сложность, как компьютеры представляют, определяют, хранят, обмениваются/передают и отображают эти различные формы текста эффективным и стандартизированным/обычно понятным способом?
На заре современных цифровых вычислений централизация была сосредоточена вокруг Великобритании и США, поэтому английский язык был преобладающим языком и используемым алфавитом.
Как мы видели выше, ~95 символов английского алфавита (и необходимая пунктуация) могут быть индивидуально представлены с использованием 7-битных значений (0-127), с оставленным местом для дополнительных невидимых управляющих кодов.
В 1963 году Американский национальный институт стандартов (ANSI) опубликовал стандарт X3.4-1963 для Американского стандартного кода для обмена информацией (ASCII), который стал основой того, что мы сейчас знаем как стандарт ASCII.
… и у Microsoft плохая репутация из-за названий вещей 😉 Первоначальный стандарт X3.4-1963 оставил 28 значений неопределенными и зарезервированными для использования в будущем. Воспользовавшись случаем, Международный консультативный комитет по телеграфу и телефону (CCITT, от французского: Comité Consultatif International Téléphonique et Télégraphique) предложил изменить раскладку ANSI, из-за которой символы нижнего регистра отличались по битовому шаблону от символов верхнего регистра на всего один бит. Это упрощенное определение/сопоставление регистра символов и конструкция клавиатур и принтеров.
Со временем в некоторые символы и управляющие коды были внесены дополнительные изменения, пока мы не пришли к хорошо зарекомендовавшей себя таблице символов ASCII, которая поддерживается практически всеми используемыми сегодня вычислительными устройствами.
]4 7-битная таблица ASCII
Однако быстрое распространение компьютеров в Европе поставило новую задачу: как представить текст на языках, отличных от английского. Например, как должны быть представлены буквы с диакритическими знаками, умлауты и дополнительные символы?
Для этого таблица ASCII была расширена за счет добавления дополнительного бита, что сделало символы 8-битными, добавив 127 «расширенных символов»:
]5 Расширенные 8-битные символы ASCII
по-прежнему не предоставлял достаточно места для представления всех символов, глифов и символов, необходимых пользователям компьютеров по всему миру, многим из которых необходимо было представлять и отображать дополнительные символы / глифы.
Итак, кодовые страницы были введены.
Кодовые страницы определяют наборы символов для «расширенных символов» от 0x80 до 0xff (и, в некоторых случаях, несколько не отображаемых символов между 0x00 и 0x19). Выбрав другую кодовую страницу, Терминал может отображать дополнительные глифы для европейских языков и некоторые блочные символы (см. выше), текст CJK, вьетнамский текст и т. д.
любой стандартизации кодовых страниц в целом усложнил обработку и рендеринг текста, привел к ошибкам и создал серьезные проблемы взаимодействия и взаимодействия с пользователем.
Еще хуже то, что 128 дополнительных глифов даже близко не обеспечивают достаточное количество символов для представления некоторых языков: например, в китайском языке средней школы используется 2200 идеограмм, еще несколько сотен используются в повседневной жизни, и более 7000 идеограмм в общий.
Очевидно, что кодовые страницы — дополнительные наборы из 128 символов — не являются масштабируемым решением этой проблемы. 16 — 1 == 65 535 символов. Однако, несмотря на попытки стандартизировать японскую кодировку Shift JIS и кодировку EUC-JP, совместимую с ASCII переменной длины, кодировки кодовых страниц DBCS часто были пронизаны проблемами и не давали универсального решения проблемы кодирования текста.
Что нам действительно было нужно, так это универсальный код для текстовых данных.
Разработка Unicode началась в 1987 году инженерами Xerox и Apple. Первоначальная спецификация Unicode-88 была опубликована в феврале 1988 года и с тех пор постоянно совершенствовалась и обновлялась, добавляя новые представления символов, дополнительную языковую поддержку и даже эмодзи 😊
.Чтобы узнать больше об истории Unicode, прочтите это! Сегодня Unicode поддерживает до 1 112 064 допустимых «кодовых точек», каждая из которых представляет один символ / символ / глиф / идеограмму / и т. д. Это должно обеспечить множество адресуемых кодовых точек в будущем, особенно с учетом того, что «Юникод 11 в настоящее время определяет 137 439 кодовых точек».символов, охватывающих 146 современных и исторических шрифтов, а также несколько наборов символов и эмодзи» [источник: Википедия, октябрь 2018 г.]
«1,2 миллиона кодовых точек должно быть достаточно для всех» — источник: Rich Turner, октябрь 2018 г. Текстовые данные Unicode могут быть закодированы разными способами, каждый из которых имеет свои сильные и слабые стороны:
Кодировка | Примечания | # Байтов на кодовую точку | Плюсы | Минусы |
UTF-32 | Каждое допустимое 32-битное значение является прямым индексом для отдельной кодовой точки Unicode. | 4 | Не требуется декодирование | Потребляет много места |
UTF-16 | Кодирование переменной длины, требующее одного или двух 16-битных значений для представления каждой кодовой точки. | 2/4 | Простое декодирование | Занимает 2 байта даже для текста ASCII. Может быстро закончиться необходимостью 4 байта |
УКС-2 | Предшественник UTF-16. 16-битная кодировка фиксированной длины, используемая внутри Windows, Java и JavaScript. | 2 | Простое декодирование | Занимает 2 байта даже для текста ASCII. Невозможно представить некоторые кодовые точки |
UTF-8 | Кодирование переменной длины. Требуется от одного до четырех байтов для представления всех кодовых точек Unicode. | 1-4 | Требования к эффективному, детализированному хранилищу | Умеренная стоимость декодирования |
Другие | Существуют и другие кодировки, но они не получили широкого распространения. | Н/Д | Н/Д | Н/Д |
Во многом благодаря своей гибкости и эффективности хранения/передачи UTF-8 стал преобладающим механизмом кодирования текста в Интернете: на сегодняшний день (октябрь 2018 г. ) 92,4% всех веб-страниц закодированы в UTF-8!
]16 Популярность кодировки UTF-8 для веб-страниц (источник: Википедия)
Следовательно, все, что обрабатывает текст,0025 не менее иметь возможность поддерживать текст UTF-8.
Чтобы узнать больше о кодировании текста и Unicode, прочитайте замечательную статью Джоэла Спольски здесь: Абсолютный минимум, который каждый разработчик программного обеспечения обязательно должен знать о Unicode и наборах символов (без оправданий!)
Увы, консоль Windows (в настоящее время) не может поддерживать текст UTF-8!
Консоль Windows была создана еще на заре Windows, еще до того, как появился сам Unicode! Тогда было принято решение представлять каждый текстовый символ как 16-битное значение фиксированной длины (UCS-2). Таким образом, текстовый буфер консоли содержит 2 байта wchar_t
значений на ячейку сетки, размер x
столбцов на y
строк.
Несмотря на то, что этот дизайн поддерживает консоль более 25 лет, быстрое внедрение UTF-8 начало вызывать проблемы:
кодировке, он не может представлять все кодовые точки Unicode.
Еще одна связанная, но отдельная проблема с консолью Windows заключается в том, что, поскольку GDI используется для рендеринга текста консоли, а GDI не поддерживает возврат шрифта, консоль не может отображать глифы для кодовых точек, которые не существуют в выбранном в данный момент шрифте!
Font-fallback — это возможность динамического поиска и загрузки шрифта, похожего на текущий выбранный шрифт, но содержащего глиф, отсутствующий в текущем выбранном шрифте. Эти объединенные проблемы являются причиной того, что консоль Windows не может (в настоящее время) отображать многие сложные китайские идеограммы и не может отображать смайлики.
Смайлик? СРОЧНО? На первый взгляд это может показаться тривиальным, но это проблема, поскольку некоторые инструменты теперь генерируют эмодзи, например, для обозначения результатов теста, а исходный код некоторых языков программирования поддерживает/требует Unicode, включая эмодзи!
[Источник: вы можете использовать символы эмодзи в именах переменных, констант, функций и классов Swift]
Но я отвлекся…
цвет переднего плана и фона, а также любую другую необходимую информацию о каждой ячейке.
Эти атрибуты должны храниться эффективно и быстро — нет необходимости хранить фоновую и основную информацию для каждой ячейки отдельно, тем более что большинство консольных приложений/инструментов выводят довольно однородно окрашенный текст, но сохранение и извлечение атрибутов не должно излишне снижать производительность рендеринга.
Давайте покопаемся и выясним, как со всем этим справляется Консоль! 😊
Как обсуждалось в предыдущем посте этой серии, команда консоли была занята капитальным ремонтом внутренних компонентов консоли Windows для последних нескольких выпусков Win10, тщательно модернизируя, объединяя в модули, упрощая и улучшая код и функции консоли… при этом не жертвуя заметно производительность, а не изменение текущего поведения.
Для каждого серьезного изменения мы оцениваем и прототипируем несколько подходов, а также измеряем производительность консоли, объем используемой памяти, энергопотребление и т. д., чтобы найти лучшее реальное решение. Мы использовали тот же подход для работы по улучшению буфера, которая была начата до выпуска 1803 и продолжается после 1809..
Основная проблема, которую необходимо решить, заключалась в том, что консоль ранее сохраняла текстовые данные каждой ячейки в виде 2-байтовых значений фиксированной длины UCS-2 wchar_t
.
Для полной поддержки всех символов Unicode нам требовался более гибкий подход, не добавляющий заметных затрат на обработку или память в общем случае, но способный динамически обрабатывать дополнительные байты текстовых данных для ячеек, содержащих многобайтовые символы Unicode.
Мы рассмотрели несколько подходов, создали прототипы и измерили некоторые из них, что помогло нам исключить некоторые потенциальные подходы, которые оказались неэффективными в реальных условиях.
В итоге мы пришли к следующей архитектуре:
]21 Архитектура текстового буфера консоли
Сверху (синие прямоугольники исходного буфера):
Несколько ключевых изменений были внесены в реализацию буфера консоли (обозначены оранжевым на схеме выше), в том числе:
CharRowCell::DbcsAttribute
хранит информацию о форматировании о том, насколько широкими являются текстовые данные для символов DBCS. Не все биты использовались, поэтому был добавлен дополнительный флаг , чтобы указать, превышает ли длина текстовых данных для ячейки один 16-битный wchar_t
. Если этот флаг установлен, консоль будет извлекать текстовые данные из UnicodeStorage
. Добавлен UnicodeStorage
, который содержит карту координат {строка:столбец}
для набора 16-битных wchar
значений. Это позволяет буферу хранить произвольное количество значений wchar
для каждой отдельной ячейки в консоли, которая должна хранить дополнительные текстовые данные Unicode, гарантируя, что консоль останется невосприимчивой к расширению до области и диапазона текстовых данных Unicode в будущем. . А поскольку UnicodeStorage
— это карта, затраты на поиск текста переполнения постоянны и быстры! Итак, представьте, если ячейке нужно отобразить смайлик улыбающегося лица Unicode: 😀 Представление этого смайлика в байтах (с прямым порядком байтов): 0xF0 0x9F 0x98 0x80
, или прописью: 0x9FF0 0x8098
. Ясно, что этот глиф эмодзи не помещается в один 2-байтовый wchar_t
. Таким образом, в новом буфере будет установлен флаг «переполнения» DbcsAttribute CharRowCell, указывающий, что консоль должна искать данные в кодировке UTF-16 для этого {row:col}
, хранящегося в контейнере карты UnicodeStorage.
Ключевой момент, который следует отметить в отношении этого подхода, заключается в том, что нам не нужно дополнительное хранилище, если символ может быть представлен как одно 8/16-битное значение: нам нужно хранить дополнительный «переполненный» текст только тогда, когда это необходимо. Это гарантирует, что в наиболее распространенном случае — при хранении символов ASCII и более простых символов Unicode — мы не увеличиваем объем потребляемых данных и не снижаем производительность.
Если вы используете Windows 10 October 2018 Update (сборка 1809), вы уже используете этот новый буфер!
Мы протестировали новый буфер, прежде чем незаметно включить его в сборки Insider за несколько месяцев до выпуска 1809, и внесли некоторые ключевые улучшения до выпуска 1809.
Не совсем так!
Мы также работаем над дальнейшим улучшением реализации буфера в последующих обновлениях ОС (и с помощью инсайдерских сборок, предшествующих каждому выпуску ОС).
Указанные выше изменения позволяют хранить только одну кодовую точку на CharRowCell
. Более сложные глифы, для которых требуется несколько кодовых точек, пока не поддерживаются, но мы работаем над добавлением этой возможности в будущем выпуске ОС.
Текущие изменения также не охватывают то, что требуется для нашего «режим обработанного ввода», который представляет редактируемую строку ввода для таких приложений, как CMD.exe. Мы планируем и активно обновляем код для всплывающих окон, псевдонимов команд, истории команд и самой редактируемой строки ввода, чтобы также поддерживать полную поддержку Unicode.
И пока не пытайтесь отображать эмодзи — для этого требуется новый движок рендеринга, который поддерживает возврат шрифта — возможность динамически находить, загружать и отображать глифы из шрифтов, отличных от текущего выбранного шрифта. И это тема целого поста в другой раз 😉.
Оставайтесь с нами, скоро появятся новые сообщения!
Мы с нетерпением ждем ваших мыслей — не стесняйтесь выключать звук ниже или пинговать Рича в Твиттере.
LaTeX широко используется в науке, и программирование стало важным аспектом в нескольких областях науки, отсюда и потребность в инструменте, правильно отображающем код. В этой статье объясняется, как использовать стандартную среду verbatim , а также листинги пакета , которые предоставляют более продвинутые функции форматирования кода. В этой отдельной статье обсуждается пакет minted
, который выполняет подсветку синтаксиса с помощью Python 9.0213 pygmentize библиотека .
Инструментом по умолчанию для отображения кода в LaTeX является verbatim
, который генерирует вывод моноширинным шрифтом.
\begin{verbatim} Текст заключен внутри окружения \texttt{verbatim} печатается напрямую и все команды \LaTeX{} игнорируются. \end{дословно}
Открыть этот пример на обратной стороне
Приведенный выше код выдает следующий результат:
Как и в примере во введении, весь текст печатается с разрывами строк и пробелами. Существует версия этой команды со звездочкой, вывод которой немного отличается.
\начать{дословно*} Текст заключен внутри окружения \texttt{verbatim} печатается напрямую и все команды \LaTeX{} игнорируются. \end{дословно*}
Открыть этот пример на обратной стороне
Приведенный выше код выдает следующий результат:
В этом случае пробелы выделяются специальным символом «видимый пробел»: ␣
.
Текст, подобный Verbatim, также может быть использован в абзаце с помощью \verb 9Команда 0214.
В каталоге \verb|C:\Windows\system32| можно найти много окон системные приложения. Команда \verb+\ldots+ создает \ldots
Открыть этот пример на обратной стороне
Приведенный выше код выдает следующий результат:
Команда \verb|C:\Windows\system32|
печатает текст внутри разделителей |
в дословном формате. В качестве разделителя можно использовать любой символ, кроме букв и *
. Например \verb+\ldots+
использует +
в качестве разделителя.
Чтобы использовать среду lstlisting
, вы должны добавить следующую строку в преамбулу вашего документа:
\usepackage{списки}
Вот пример использования среды lstlisting
из пакета listings
:
\begin{lstlisting} импортировать numpy как np def incmatrix(genl1,genl2): м = len(genl1) n = длина (genl2) M = None # чтобы стать матрицей инцидентности VT = np. zeros((n*m,1), int) #фиктивная переменная # вычислить побитовую матрицу xor M1 = битовая матрица (genl1) M2 = np.triu (bitxormatrix (genl2), 1) для я в диапазоне (м-1): для j в диапазоне (i+1, m): [r,c] = np.where(M2 == M1[i,j]) для k в диапазоне (len (r)): VT[(i)*n + r[k]] = 1; VT[(i)*n + c[k]] = 1; VT[(j)*n + r[k]] = 1; VT[(j)*n + c[k]] = 1; если M равно None: M = np.copy(VT) еще: M = np.concatenate ((M, VT), 1) VT = np.zeros ((n * m, 1), целое число) вернуть М \end{список}
Откройте пример объявлений
на обратной стороне
Приведенный выше код выдает следующий результат:
В этом примере выходные данные игнорируют все команды LaTeX, а текст печатается с сохранением всех разрывов строк и пробелов. Давайте посмотрим второй пример:
\begin{lstlisting}[язык=Python] импортировать numpy как np def incmatrix(genl1,genl2): м = len(genl1) n = длина (genl2) M = None # чтобы стать матрицей инцидентности VT = np.zeros((n*m,1), int) #фиктивная переменная # вычислить побитовую матрицу xor M1 = битовая матрица (genl1) M2 = np.triu (bitxormatrix (genl2), 1) для я в диапазоне (м-1): для j в диапазоне (i+1, m): [r,c] = np.where(M2 == M1[i,j]) для k в диапазоне (len (r)): VT[(i)*n + r[k]] = 1; VT[(i)*n + c[k]] = 1; VT[(j)*n + r[k]] = 1; VT[(j)*n + c[k]] = 1; если M равно None: M = np.copy(VT) еще: M = np.concatenate ((M, VT), 1) VT = np.zeros ((n * m, 1), целое число) вернуть М \end{список}
Откройте пример объявлений
на обратной стороне
Приведенный выше код выдает следующий результат:
Дополнительный параметр в скобках [language=Python]
включает подсветку кода для данного конкретного языка программирования (Python), специальные слова выделены жирным шрифтом, а комментарии выделены курсивом. Полный список поддерживаемых языков программирования см. в справочном руководстве.
Код обычно хранится в исходном файле, поэтому команда, которая автоматически извлекает код из файла, становится очень удобной.
Следующий код будет напрямую импортирован из файла \lstinputlisting[language=Octave]{BitXorMatrix.m}
Команда \lstinputlisting[language=Octave]{BitXorMatrix.m}
импортирует код из файла BitXorMatrix.m , дополнительный параметр в скобках включает подсветку языка для языка программирования Octave. Если вам нужно импортировать только часть файла, вы можете указать два параметра через запятую внутри скобок. Например, чтобы импортировать код из строки 2 в строку 12, предыдущая команда становится
\lstinputlisting[language=Octave, firstline=2, lastline=12]{BitXorMatrix.m}
Если первая строка
или последняя строка
опущены, предполагается, что значения находятся в начале или в конце файла соответственно.
Форматирование кода с помощью пакета listing имеет широкие возможности настройки. Давайте посмотрим на пример
\documentclass{статья} \usepackage{списки} \usepackage{xcolor} \definecolor{codegreen}{rgb}{0,0.6,0} \definecolor{codegray}{rgb}{0,5,0,5,0,5} \definecolor{codepurple}{rgb}{0,58,0,0,82} \definecolor{backcolor}{rgb}{0,95,0,95,0,92} \lstdefinestyle{мой стиль}{ backgroundcolor=\color{backcolor}, комментарий стиль = \ цвет {codegreen}, ключевой стиль=\цвет{пурпурный}, numberstyle=\tiny\color{codegray}, stringstyle=\color{codepurple}, базовый стиль=\ttfamily\размер сноски, breakatwhitespace=ложь, линии разрыва = истина, заголовокпоз=б, keepspaces=true, числа = слева, цифрыep=5pt, выставочные пространства = ложь, showstringspaces=false, шоутабс=ложь, вкладка = 2 } \lstset{стиль=мой стиль} \начать{документ} Следующий код будет напрямую импортирован из файла \lstinputlisting[language=Octave]{BitXorMatrix. m} \конец{документ}
Приведенный выше код выдает следующий результат:
Как видите, цветовая гамма и стиль кода значительно улучшают читабельность.
В этом примере импортируется пакет xcolor , а затем используется команда \definecolor{}{}{}
для определения новых цветов в формате rgb, которые будут использоваться позже. Для получения дополнительной информации см.: использование цветов в LaTeX.
По сути, есть две команды, которые генерируют стиль для этого примера:
\lstdefinestyle{mystyle}{...}
\lstset{style=mystyle}
Как и в случае с плавающими элементами (таблицы и рисунки), к списку можно добавлять подписи для более наглядного представления.
\begin{lstlisting}[language=Python, caption=пример Python] импортировать numpy как np def incmatrix(genl1,genl2): м = len(genl1) n = длина (genl2) M = None # чтобы стать матрицей инцидентности VT = np.zeros((n*m,1), int) #фиктивная переменная # вычислить побитовую матрицу xor M1 = битовая матрица (genl1) M2 = np.triu (bitxormatrix (genl2), 1) для я в диапазоне (м-1): для j в диапазоне (i+1, m): [r,c] = np.where(M2 == M1[i,j]) для k в диапазоне (len (r)): VT[(i)*n + r[k]] = 1; VT[(i)*n + c[k]] = 1; VT[(j)*n + r[k]] = 1; VT[(j)*n + c[k]] = 1; если M равно None: M = np.copy(VT) еще: M = np. concatenate ((M, VT), 1) VT = np.zeros ((n * m, 1), целое число) вернуть М \end{список}
Откройте пример объявлений
на обратной стороне
Приведенный выше код выдает следующий результат:
Добавление разделенного запятыми параметра caption=Python example
внутри скобок включает заголовок. Эта подпись может быть позже использована в списке объявлений.
\lstlistoflistings
Откройте эту ссылку, чтобы попробовать пример пакета списков
на Overleaf.
поддерживаемые языки (и их диалекты, если возможно, диалекты указаны в скобках, а диалекты по умолчанию выделены курсивом):
ABAP (R/2 4.3, R/2 5.0, R/3 3.1, R/3 4.6C, R/3 6.10 ) | АСЛ |
Ада ( 2005 , 83, 95) | Алгол (60, 68 ) |
Муравей | Ассемблер(Motorola68k, x86masm) |
Awk ( gnu , POSIX) | баш |
Базовый (визуальный) | C ( ANSI , Гендель, объектив, острый) |
C++ (ANSI, GNU, ISO , Visual) | Caml ( свет , объектив) |
КИЛ | Чистый |
Кобол (1974, 1985 , IBM) | Комал 80 |
command. com ( WinXP ) | Комсол |
кш | Делфи |
Эйфель | Элан |
Эрланг | Эйфория |
Фортран (77, 90, 95 ) | ГКЛ |
Гнуплот | Хаскелл |
HTML | IDL (пусто, CORBA) |
сообщить | Java (пусто, AspectJ) |
JVMIS | кш |
Языкознание | Лисп (пусто, Авто) |
Логотип | сделать (пусто, гну) |
Mathematica (1.0, 3.0, 5.2 ) | Матлаб |
Меркурий | МетаПост |
Миранда | Мицар |
МЛ | Модуль-2 |
МуПАД | НАСТРАН |
Оберон-2 | OCL (декоративная, OMG ) |
Октава | унций |
Паскаль (Borland6, Стандарт , XSC) | Перл |
PHP | PL/I |
Плазма | Постскриптум |
POV | Пролог |
Промела | PSTриксы |
Питон | Р |
Уменьшить | Рекс |
РГБ | Рубин |
S (пустой, ПЛЮС) | САС |
Scilab | ш |
ШЕЛXL | Simula ( 67 , CII, DEC, IBM) |
СПАРКЛ | SQL |
ткл (пустой, тк) | TeX (AlLaTeX, обычный, LaTeX, простой , примитивный) |
VBScript | Верилог |
VHDL (пустой, AMS) | ВРМЛ ( 97 ) |
XML | XSLT |