11l

Материал из Циклопедии
Перейти к навигации Перейти к поиску
11l
Файл:11l programming language logo.png
Тип исполнения:компилируемый
Появился в:2018
Автор(ы):Александр Третьяк
Расширение файлов:.11l
Релиз:2022.4
Типизация данных:Статическая, строгая
Испытал влияние:Python, C++
ЛицензияMIT
Сайт:11l-lang.org

11l (elevenel) — это императивный, статически типизированный, компилируемый язык программирования общего назначения, дизайн которого направлен на то, чтобы совместить хорошую читаемость и выразительность кода (как в Python) с производительностью C++.

В отличие от других языков программирования, ключевые слова 11l структурированы в иерархию. На верхнем уровне этой иерархии располагается 11 базовых/корневых ключевых слов. Данная черта легла в основу названия языка программирования 11l, где «l» означает «litterae» в латинском, «logos» в греческом (в значении «слово»), либо «letters» в английском (так как корневые ключевые слова языка можно сокращать до одной буквы).

Несмотря на то, что язык всё ещё находится на ранней стадии развития, ядро языка и его стандартная библиотека содержат достаточный функционал для решения большинства задач на Rosetta Code[1]. (По количеству решённых задач на Rosetta Code[en] на данный момент язык 11l находится на 20-м месте.)

Выбор операторов[править]

Большинство операторов 11l имеют рациональное обоснование их выбора[2]. Так, для операции ‘поразрядное исключающее «или»’ используется тройка символов ( (открывающая скобка), + (плюс) и ) (закрывающая скобка), так как они похожи на символ ⊕, который используется в алгебре логики для обозначения операции исключающего «или». И хотя символ ⊕ используется чаще для одноразрядных значений, в Википедии встречается его применение для указателей (см. XOR-связный список) и для массивов из байт (см. HMAC).

Для операции «возведение в степень» был выбран символ ^ (карет), так как его часто используют при написании формул и математических выражений не только в языках программирования и компьютерных системах, но и в простом тексте. [Использовать символ ^ для операции ‘поразрядное исключающее «или»’ (как это сделано в Си и большинстве других языков программирования) можно считать неудачной идеей, так как это сбивает с толку новичков в программировании[3].]

Для операции «целочисленное деление» были выбраны буква I и символ / (наклонная черта). I обозначает Integer — целочисленный.

Для конкатенации массивов выбрана тройка символов [ (открывающая квадратная скобка), + (плюс) и ] (закрывающая квадратная скобка), так как массивы в 11l (также как в языках JavaScript, Python, Ruby, Swift и многих других) задаются с использованием квадратных скобок (например, [1, 2, 3]). А так как эта операция достаточно ресурсоёмкая, ей выделен отдельный оператор.

Лексический анализ[править]

По утверждению[4] разработчика языка, в 11l реализован самый совершенный на данный момент лексический анализатор из всех существующих языков программирования. Данный анализатор, в частности, позволяет практически полностью избавиться от визуальных помех, таких как обязательные символы «точка с запятой» в конце утверждений, фигурные скобки (либо ключевые слова begin и end) для обозначения блоков кода, круглые скобки вокруг условий/выражений (у операторов if, while и пр.), а также символы двоеточие (:) и обратная косая черта (\) в конце строк. Вот пример кода на языке Си и соответствующий ему код на 11l (данный пример не синтетический, а является переводом этого Python-кода):

C/C++/C# 11l

<syntaxhighlight lang="C"> while (true) {

   switch (instr[i]) {
   case '[':
       nesting_level++;
       break;
   case ']':
       if (--nesting_level == 0)
           goto break_;
       break;
   }
   i++;
   ...

} break_: </syntaxhighlight>

<syntaxhighlight lang="11l"> loop

  switch instr[i]
     "["
        nesting_level++
     "]"
        if --nesting_level == 0
           loop.break
  i++

</syntaxhighlight>

Для обозначения блоков кода вместо языковых средств предлагается использовать на уровне среды разработки менее отвлекающие (нежели символы либо ключевые слова) пунктирные линии:

Dotted lines for code blocks.png

Стандартная библиотека[править]

Стандартная библиотека 11l берёт за основу библиотеку языка Python, но многие функции были переработаны, а недочёты/недостатки исправлены. Например[5]:

  1. Функция random.randrange(a, b), которая возвращает случайное число n в диапазоне a <= n < b, и функция random.randint(a, b), которая возвращает число в диапазоне a <= n <= b, были объединены в одну функцию, которая принимает один аргумент типа «диапазон» (а диапазон для a <= n <= b в 11l обозначается как a..b, а для a <= n < b как a.<b).
  2. Метод объекта регулярного выражения match() заменён на метод fullmatch() (другими словами, fullmatch() из Python соответствует match() в 11l).
  3. Функции re.split и re.sub вынесены из модуля re в перегруженные методы строк split и replace соответственно.
  4. Функция gettempdir() из модуля tempfile и некоторые функции из модуля os (listdir, walk, mkdir, makedirs, remove, rename и др.) перенесены в отдельный модуль fs; функции модуля os.path перенесены в fs:path.
  5. Вместо модуля heapq в 11l присутствуют два модуля: minheap (аналог heapq) и maxheap, не имеющий непосредственного аналога в Python.
  6. Функции bin и hex возвращают строку без префиксов 0b и 0x соответственно, так как чаще требуется именно строка без префикса.[6][7][8][9][10][11][12][13][14]
  7. "\n".join(arr) в Python соответствует arr.join("\n") в 11l (при этом элементами arr в 11l могут быть не только строки, как в Python, а любые объекты, для которых определено преобразование в строку).
  8. map(lambda x: x * 2, filter(lambda x: x % 2 == 0, [1, 2, 3, 4])) в Python соответствует [1, 2, 3, 4].filter(x -> x % 2 == 0).map(x -> x * 2) в 11l.

Принципы проектирования[править]

11l спроектирован таким образом, что сгенерированные, используя одинаковый исходный код, на различных системах файлы всегда будут бинарно одинаковы. Так, например, в Python при открытии текстового файла кодировка по умолчанию зависит от платформы. В 11l же используется по умолчанию UTF-8. Символ/-ы для обозначения конца строк при записи текстовых файлов в Python также платформозависимы, а в 11l используется окончание строк в стиле Unix (то есть один символ LF) при записи текстовых файлов (при чтении текстовых файлов символ CR просто игнорируется).

Минималистичный дизайн 11l делает возможным относительно просто изучить язык целиком (включая всю стандартную библиотеку).

Особенности реализации[править]

Эталонная реализация 11l поставляется в виде транспайлера Python → 11l → C++ и, таким образом, может использоваться не только для компиляции кода на 11l, но и для компиляции кода на Python [что даёт в результате его значительное (зачастую, более чем на порядок) ускорение]. Следует отметить, что особенностью данного транспайлера является то, что он генерирует человекочитаемый код на 11l (что может помочь в изучении языка 11l тем, кто уже знает Python) и человекочитаемый код на C++ (что упрощает отладку написанной программы).

Примечания[править]

  1. 11l - Rosetta Code. Проверено 30 апреля 2022.
  2. Операторы языка 11l. Проверено 30 апреля 2022.
  3. what is ^ used for in ruby? (Stack Overflow). Проверено 30 апреля 2022.
  4. Статья «Лексический анализ в 11l»
  5. Стандартная библиотека. Отличия от Python. Основные отличия
  6. Gray code - Rosetta Code. Проверено 30 апреля 2022.
  7. Geohash - Rosetta Code. Проверено 30 апреля 2022.
  8. Decimal floating point number to binary - Rosetta Code. Проверено 30 апреля 2022.
  9. Python-projects/n5110_BMP_converter.py · GitHub
  10. URL encoding - Rosetta Code. Проверено 30 апреля 2022.
  11. UTF-8 encode and decode - Rosetta Code. Проверено 30 апреля 2022.
  12. Solve triangle solitare puzzle - Rosetta Code. Проверено 30 апреля 2022.
  13. Variable-length quantity - Rosetta Code. Проверено 30 апреля 2022.
  14. Numbers with same digit set in base 10 and base 16 - Rosetta Code. Проверено 30 апреля 2022.

Ссылки[править]

 
Используемые
в разработке

Ада A+ APL Atlast Forth AWL Язык ассемблера ActionScript ABAP/4 AutoIt AWK BeanShell Бейсик Си Кобол C++ C# Clarion Clojure ColdFusion Common Lisp D dBase Delphi DuAL Eiffel Erlang Euphoria F# Форт Фортран Gambas Go Groovy HAL/S Haskell IBM PL/S Icon IridiumJava JavaScript Limbo Lua Модула-3 Object Pascal Objective-C OCaml Oz Parser Паскаль Компонентный Паскаль Perl Pixilang PHP PowerBASIC Python ПЛ/1 Пролог Qi Ruby Scala Scheme Seed7 Smalltalk SQL PL/SQL Tcl TouchDesigner Vala Visual Basic (.NET) • X-Robot

Академические

Agda Clean Curry Idris Лого ML Оберон Planning C РЕФАЛ Симула

IEC 61131-3

Instruction List ST FBD Ladder Diagram (LD) • SFC

Прочие

Алгол Алгол 68 Модула-2 Миранда Hope НОРМИН Санда

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

HQ9+/HQ9++ • INTERCAL Brainfuck Befunge Malbolge Piet Spoon Unlambda Whitespace FALSE LOLCODE Глагол

Визуальные

G (LabVIEW) • Microsoft VPL Sikuli VisSim Алиса ДРАКОН Скретч

Прочее

ДинамическиеКомпилируемыеС ключевыми словами не на английском языке С C-style синтаксисом СинтаксисYoptaScript

Категория Языки программирования