11l

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

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

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

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

Выбор операторов

Большинство операторов 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
while (true) {
    switch (instr[i]) {
    case '[':
        nesting_level++;
        break;
    case ']':
        if (--nesting_level == 0)
            goto break_;
        break;
    }
    i++;
    ...
}
break_:
loop
   switch instr[i]
      "["
         nesting_level++
      "]"
         if --nesting_level == 0
            loop.break
   i++

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

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

Ссылки