- PVSM.RU - https://www.pvsm.ru -

Объясняем код с помощью ASCII-арта

Примечание от переводчика: типично пятничная статья во вторник утром… почему бы и нет?

Объясняем код с помощью ASCII-арта - 1

Большинство людей — визуалы. Они используют изображения, чтобы вникнуть в суть проблемы. А вот мэйнстримные языки программирования, напротив, основаны на текстовом представлении. Возникающую пропасть между текстом и графикой заполняют ASCII-изображения, нарисованные с помощью текстовых символов и вставленные в исходный код программы. Я их обожаю! Как-то раз я кинул клич в Twitter и мне прислали гораздо больше примеров, чем я ожидал. Спасибо всем участвовавшим. В этой теме попалось несколько прекрасных примеров, которые я собрал и разложил на категории. Для каждого изображения дается ссылка на соответствующий репозиторий.

Структуры данных

Одно из самых распространенных применений ASCII-арта в коде — наглядно показать структуру данных.

Первый пример из исходного кода LLVM:

Объясняем код с помощью ASCII-арта - 2
Исходник [1]

Расположение полей в структуре данных в Jikes RVM:

Объясняем код с помощью ASCII-арта - 3
Исходник [2]

Поворот дерева в Musl:

Объясняем код с помощью ASCII-арта - 4
Исходник [3]

Двусторонняя очередь в Rust:

Объясняем код с помощью ASCII-арта - 5
Исходник [4]

Внутренности компилятора Swift:

Объясняем код с помощью ASCII-арта - 6
Исходник [5]

Расположение элементов в заголовке Malloc:

Объясняем код с помощью ASCII-арта - 7
Исходник [6]

Конечные автоматы

Профилирование Javascript:

Объясняем код с помощью ASCII-арта - 8
Исходник [7]

RPC в Cloud Spanner:

Объясняем код с помощью ASCII-арта - 9
Исходник [8]

Состояния потока ввода-вывода:

Объясняем код с помощью ASCII-арта - 10
Исходник [9]

Логика предметной области

Поток управления в декомпилируемой программе NWScript:

Объясняем код с помощью ASCII-арта - 11
Исходник [10]

Внутренности ECC:

Объясняем код с помощью ASCII-арта - 12
Исходник [11]

Форматирование чисел:

Объясняем код с помощью ASCII-арта - 13
Исходник [12]

Квантовый контур:

Объясняем код с помощью ASCII-арта - 14
Исходник [13]

Балансировка задач управления памятью в ядре операционной системы:

Объясняем код с помощью ASCII-арта - 15
Исходник [14]

Совместимость типов (это особенно впечатляющий случай, потому что здесь ASCII-арт является кодом!)

Объясняем код с помощью ASCII-арта - 16
Исходник [15]

Формат файла DBF:

Объясняем код с помощью ASCII-арта - 17
Исходник [16]

Lookup-таблица для обработки изображений:

Объясняем код с помощью ASCII-арта - 18
Исходник [17]

Форма цветовой функции:

Объясняем код с помощью ASCII-арта - 19
Исходник [18]

Структура URL:

Объясняем код с помощью ASCII-арта - 20
Исходник [19]

«Краткая» справка по отмене операций в emacs:

Объясняем код с помощью ASCII-арта - 21
Исходник [20]
Примечание переводчика: по ссылке еще очень много подобных графиков

Геометрия

Контроль высоты в бортовом компьютере Apollo (!!!):

Объясняем код с помощью ASCII-арта - 22
Исходник [21]

Разбитие изображения на сегменты:

Объясняем код с помощью ASCII-арта - 23
Исходник [22]

Траектории бумеранга в Nethack:

Объясняем код с помощью ASCII-арта - 24
Исходник [23]

Отрисовка границ элемента в CSS:

Объясняем код с помощью ASCII-арта - 25
Исходник [24]

Дерево квадрантов:

Объясняем код с помощью ASCII-арта - 26
Исходник [25]

Управление скоростью работы станка:

Объясняем код с помощью ASCII-арта - 27
Исходник [26]

Скроллинг веб-страниц:

Объясняем код с помощью ASCII-арта - 28
Исходник [27]

Надеюсь, вам понравилось!

Дополнительный пример от переводчика:

График интерполяции значения:

Объясняем код с помощью ASCII-арта - 29
Исходник [28]

Автор: Андрей

Источник [29]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/309275

Ссылки в тексте:

[1] Исходник: https://github.com/llvm-mirror/llvm/blob/release_80/lib/Analysis/SyncDependenceAnalysis.cpp#L75

[2] Исходник: https://github.com/JikesRVM/JikesRVM/blob/master/rvm/src/org/jikesrvm/objectmodel/TIBLayoutConstants.java#L19

[3] Исходник: https://git.musl-libc.org/cgit/musl/tree/src/search/tsearch.c?id=v1.1.21

[4] Исходник: https://github.com/rust-lang/rust/blob/57d7cfc3cf50f0c427ad3043ff09eaef20671320/src/liballoc/collections/vec_deque.rs#L1399

[5] Исходник: https://github.com/apple/swift/blob/master/lib/AST/NameLookup.cpp#L1521

[6] Исходник: https://code.woboq.org/userspace/glibc/malloc/malloc.c.html#1075

[7] Исходник: https://searchfox.org/mozilla-central/rev/00c0d068ece99717bea7475f7dc07e61f7f35984/tools/profiler/core/RegisteredThread.h#293-301

[8] Исходник: https://github.com/googleapis/google-cloud-go/blob/master/spanner/read.go#L353

[9] Исходник: https://github.com/carllerche/h2/blob/8a0b7ff64f5fe26324ee9f540722549231ac1ad6/src/proto/streams/state.rs#L13-L50

[10] Исходник: https://github.com/xoreos/xoreos-tools/blob/master/src/nwscript/controlflow.cpp#L328

[11] Исходник: https://github.com/dalek-cryptography/curve25519-dalek/blob/develop/src/backend/vector/avx2/edwards.rs#L123

[12] Исходник: https://searchfox.org/mozilla-central/source/js/src/builtin/intl/NumberFormat.cpp#592

[13] Исходник: https://github.com/Microsoft/QuantumKatas/blob/master/PhaseEstimation/Tasks.qs#L117

[14] Исходник: https://github.com/torvalds/linux/blob/v4.20/mm/page-writeback.c#L828

[15] Исходник: https://docs.racket-lang.org/2d/index.html

[16] Исходник: https://github.com/SocialExplorer/FastDBF/blob/master/FastDBF/DbfHeader.cs#L35

[17] Исходник: https://github.com/libvips/libvips/blob/master/libvips/convolution/sharpen.c#L412

[18] Исходник: https://github.com/chriscalo/design-system-utils/blob/master/src/color-scales.js

[19] Исходник: https://searchfox.org/mozilla-central/rev/00c0d068ece99717bea7475f7dc07e61f7f35984/netwerk/base/nsIURI.idl#9-36

[20] Исходник: https://github.com/emacsmirror/undo-tree/blob/master/undo-tree.el#L242-L751

[21] Исходник: https://github.com/chrislgarry/Apollo-11/blob/master/Comanche055/AUTOMATIC_MANEUVERS.agc#L193

[22] Исходник: https://searchfox.org/mozilla-central/rev/00c0d068ece99717bea7475f7dc07e61f7f35984/gfx/wr/webrender/src/image.rs#247

[23] Исходник: https://github.com/NetHack/NetHack/blob/1a8a774719abe55b5a57f63cc43f183339dc6433/src/zap.c#L3461-L3472

[24] Исходник: https://searchfox.org/mozilla-central/rev/00c0d068ece99717bea7475f7dc07e61f7f35984/layout/painting/nsCSSRenderingBorders.cpp#918-956

[25] Исходник: https://github.com/libfive/libfive/blob/master/libfive/src/render/brep/simplex/simplex_tree.cpp#L688-L717

[26] Исходник: https://github.com/grbl/grbl/blob/b237ad566ad25a1503e14fa5f487c34f88bec01f/grbl/stepper.c#L147

[27] Исходник: https://github.com/stipsan/compute-scroll-into-view/blob/d6447854d04031ee3942c6d5654a8477b6bb928f/src/index.ts#L124-L168

[28] Исходник: https://github.com/impworks/corund/blob/master/Corund/Tools/Interpolation/Interpolate.cs#L305

[29] Источник: https://habr.com/ru/post/440830/?utm_source=habrahabr&utm_medium=rss&utm_campaign=440830