11l
11l | |
Тип исполнения: | компилируемый |
---|---|
Появился в: | 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> |
Для обозначения блоков кода вместо языковых средств предлагается использовать на уровне среды разработки менее отвлекающие (нежели символы либо ключевые слова) пунктирные линии:
Стандартная библиотека[править]
Стандартная библиотека 11l берёт за основу библиотеку языка Python, но многие функции были переработаны, а недочёты/недостатки исправлены. Например[5]:
- Функция
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
). - Метод объекта регулярного выражения
match()
заменён на методfullmatch()
(другими словами,fullmatch()
из Python соответствуетmatch()
в 11l). - Функции
re.split
иre.sub
вынесены из модуляre
в перегруженные методы строкsplit
иreplace
соответственно. - Функция
gettempdir()
из модуляtempfile
и некоторые функции из модуляos
(listdir
,walk
,mkdir
,makedirs
,remove
,rename
и др.) перенесены в отдельный модульfs
; функции модуляos.path
перенесены вfs:path
. - Вместо модуля
heapq
в 11l присутствуют два модуля:minheap
(аналогheapq
) иmaxheap
, не имеющий непосредственного аналога в Python. - Функции
bin
иhex
возвращают строку без префиксов0b
и0x
соответственно, так как чаще требуется именно строка без префикса.[6][7][8][9][10][11][12][13][14] "\n".join(arr)
в Python соответствуетarr.join("\n")
в 11l (при этом элементамиarr
в 11l могут быть не только строки, как в Python, а любые объекты, для которых определено преобразование в строку).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++ (что упрощает отладку написанной программы).
Примечания[править]
- ↑ 11l - Rosetta Code. Архивировано из первоисточника 5 апреля 2022. Проверено 30 апреля 2022.
- ↑ Операторы языка 11l. Архивировано из первоисточника 10 августа 2019. Проверено 30 апреля 2022.
- ↑ what is ^ used for in ruby? (Stack Overflow). Архивировано из первоисточника 2 февраля 2017. Проверено 30 апреля 2022.
- ↑ Статья «Лексический анализ в 11l»
- ↑ Стандартная библиотека. Отличия от Python. Основные отличия
- ↑ Gray code - Rosetta Code. Архивировано из первоисточника 22 марта 2022. Проверено 30 апреля 2022.
- ↑ Geohash - Rosetta Code. Архивировано из первоисточника 23 марта 2022. Проверено 30 апреля 2022.
- ↑ Decimal floating point number to binary - Rosetta Code. Архивировано из первоисточника 23 марта 2022. Проверено 30 апреля 2022.
- ↑ Python-projects/n5110_BMP_converter.py · GitHub
- ↑ URL encoding - Rosetta Code. Архивировано из первоисточника 22 марта 2022. Проверено 30 апреля 2022.
- ↑ UTF-8 encode and decode - Rosetta Code. Архивировано из первоисточника 22 марта 2022. Проверено 30 апреля 2022.
- ↑ Solve triangle solitare puzzle - Rosetta Code. Архивировано из первоисточника 23 марта 2022. Проверено 30 апреля 2022.
- ↑ Variable-length quantity - Rosetta Code. Архивировано из первоисточника 22 марта 2022. Проверено 30 апреля 2022.
- ↑ Numbers with same digit set in base 10 and base 16 - Rosetta Code. Архивировано из первоисточника 23 марта 2022. Проверено 30 апреля 2022.
Ссылки[править]
- Официальный сайт
- Репозитории на GitHub
- Статья ‘Разработка когнитивно-эргономического синтаксиса для нового аппаратно-ориентированного языка программирования’
- Статья ‘Транспайлер-цепь Python → 11l → C++ (для ускорения Python-кода и не только)’