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