You can edit almost every page by Creating an account. Otherwise, see the FAQ.

11l

Материал из EverybodyWiki Bios & Wiki
Перейти к:навигация, поиск

Ошибка скрипта: Модуля «Unsubst» не существует. 

Шаблон:Язык программирования

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

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

Несмотря на то, что язык всё ещё находится на ранней стадии развития, ядро языка и его стандартная библиотека содержат достаточный функционал для решения большинства задач на Rosetta Code[1]. (По количеству решённых задач на Ошибка скрипта: Модуля «Не переведено» не существует. на данный момент язык 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
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]:

  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. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  2. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  3. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  4. Статья «Лексический анализ в 11l»
  5. Стандартная библиотека. Отличия от Python. Основные отличия
  6. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  7. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  8. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  9. Python-projects/n5110_BMP_converter.py · GitHub
  10. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  11. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  12. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  13. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.
  14. Ошибка Lua в package.lua на строке 80: module 'Module:Languages' not found.

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

Шаблон:Языки программирования Шаблон:Сортировка: изолированные статьиОшибка скрипта: Модуля «Unsubst» не существует.


This article "11l" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:11l. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.



Read or create/edit this page in another language[править]