Pull to refresh
114
Karma
3
Rating
Искандер @quasilyte

Making developer tools

Встраиваем Lua в PHP через FFI

VK corporate blog Open source *PHP *System Programming *Lua *

Foreign Function Interface — это перспективная альтернатива для традиционных PHP-расширений.


Сегодня мы будем разбирать FFI-библиотеку для работы с liblua5 из PHP, которая позволит исполнять скрипты на Lua из нашего приложения.


Читать дальше →
Total votes 43: ↑42 and ↓1 +41
Views 3.1K
Comments 11

Go ebiten: разбираемся с рендерингом и позиционированием текста

Open source *Programming *Game development *Interfaces *Go *

Перед вами первая заметка на тему разработки игр на Go с использованием библиотеки ebiten (также известный как Ebitengine).


Сегодня мы будем разбираться, как выполняется позиционирование текста. Как центрировать его, менять межстрочный интервал и так далее. Официальная документация и примеры содержат почти всё необходимое, но чтобы свести всё воедино и понять все концепции можно потратить несколько вечеров. Я постараюсь сэкономить ваше время.


Читать дальше →
Total votes 16: ↑15 and ↓1 +14
Views 3K
Comments 12

Используем SQLite в KPHP и PHP через FFI

Website development *Open source *PHP *Programming *SQLite *


Сегодня я расскажу о новой библиотеке, которая позволяет использовать SQLite сразу из PHP и KPHP.


Создавать FFI пакеты — не просто. Под катом будут ответы на следующие вопросы:


  • Как упростить установку и сделать библиотеку кроссплатформенной?
  • Как не допустить утечек ресурсов?
  • Как сделать библиотеку совместимой с KPHP и PHP?
  • Какова производительность FFI решений?

Мы не только попробуем новую библиотеку в действии, но и выработаем ряд практик, которые при широком распространении могут улучшить ситуацию с FFI пакетами в сообществе.

Читать дальше →
Total votes 13: ↑13 and ↓0 +13
Views 2.9K
Comments 1

Анализируем bound checks в Go по CPU профилю

High performance *Assembler *System Programming *Compilers *Go *

Сегодня мы будем анализировать бинарники на пару с CPU профилями, чтобы создать на их основе расширенные профили исполнения. Эти дополненные профили мы сможем использовать для оценки времени, которое программа тратит на проверки выхода за границу массивов и слайсов.


Читать дальше →
Total votes 26: ↑23 and ↓3 +20
Views 3.7K
Comments 0

Ускоряем hugo на 20% простым изменением в пакете reflect

High performance *Open source *Programming *Compilers *Go *

Найти значительное узкое место в производительности стандартной библиотеки или зрелого приложения — это редкость.


Я был удивлён, когда в top10 списке CPU-профиля hugo при сборке digitalgov.gov на первой позиции находился метод reflect.Type.MethodByName().


      flat  flat%   sum%        cum   cum%
     8.84s  6.28%  6.28%     57.85s 41.10%  reflect.(*rtype).MethodByName
     7.93s  5.63% 11.92%      8.50s  6.04%  reflect.name.readVarint
     7.56s  5.37% 17.29%    111.79s 79.43%  reflect.Value.call
     7.53s  5.35% 22.64%     23.33s 16.58%  runtime.mallocgc
     7.29s  5.18% 27.82%     16.10s 11.44%  reflect.name.name

В этой статье я расскажу вам о том, как так вышло и что с этим можно было бы сделать.

Читать дальше →
Total votes 28: ↑27 and ↓1 +26
Views 4.7K
Comments 11

profile-guided поиск по коду

High performance *Open source *Programming *Go *Development Management *

Если объединить структурный поиск по коду через gogrep и фильтрацию результатов через perf-heatmap, то мы получим profile-guided поиск по коду.


Данная комбинация позволяет находить все совпадения по шаблону поиска, а затем показывает только те результаты, что лежат на "горячем" пути исполнения.


Через perf-heatmap также можно аннотировать файл с учётом того, насколько строка исходного кода "горячая".


Читать дальше →
Total votes 20: ↑18 and ↓2 +16
Views 1.8K
Comments 0

gocorpus: открытый корпус Go кода, поддерживающий запросы

Open source *Programming *Go *

На днях я запустил wasm-приложение, которое позволяет запускать gogrep шаблоны на относительно крупном корпусе Go кода (~11 миллионов строк кода).


В этой заметке я напишу как этим пользоваться и зачем оно вообще может быть нужно.


Звёздочки нести сюда Исходный код можно найти здесь.


Читать дальше →
Total votes 33: ↑32 and ↓1 +31
Views 3.9K
Comments 4

Создаём игру на KPHP с помощью FFI и SDL

VK corporate blog Open source *PHP *Programming *Game development *
✏️ Technotext 2021

KPHP теперь поддерживает механизм Foreign Function Interface (FFI). Мы с Владом решили продемонстрировать его возможности и за сутки написали первую в мире графическую игру на KPHP.


Игру делали с использованием библиотеки SDL:


  • работали со звуком,
  • обрабатывали события клавиатуры,
  • рисовали шрифты, спрайты, UI.

API и семантика нашего FFI идентичны PHP. Поэтому созданная игра запустится и на KPHP, и на PHP.


Если вам интересны детали реализации, заглядывайте под кат!


Читать дальше →
Total votes 49: ↑45 and ↓4 +41
Views 5K
Comments 9

Заметки KPHP: тестирование и бенчмарки

VK corporate blog Open source *PHP *Programming *Game development *

Перед вами первая статья из серии "Как использовать KPHP в open source?"


В рамках этой серии мы будем разбирать разные аспекты работы с KPHP, расширяя ту информацию, что вы можете найти в официальной документации.


В сегодняшнем выпуске:


  • Базовое использование composer с KPHP
  • Как писать и запускать unit-тесты для KPHP
  • Бенчмаркинг KPHP-кода (профилирование мы затронем в другой раз)
  • Как правильно сравнивать результаты бенчмарков
Читать дальше →
Total votes 27: ↑26 and ↓1 +25
Views 2.9K
Comments 2

Релиз ruleguard v0.3.0

Open source *Programming *Go *Development Management *

Релиз ruleguard v0.3.0


А что, если я скажу вам, что линтеры для Go можно создавать вот таким декларативным способом?


func alwaysTrue(m dsl.Matcher) {
    m.Match(`strings.Count($_, $_) >= 0`).Report(`always evaluates to true`)
    m.Match(`bytes.Count($_, $_) >= 0`).Report(`always evaluates to true`)
}

func replaceAll() {
    m.Match(`strings.Replace($s, $d, $w, $n)`).
        Where(m["n"].Value.Int() <= 0).
        Suggest(`strings.ReplaceAll($s, $d, $w)`)
}

Год назад я уже рассказывал об утилите ruleguard. Сегодня хотелось бы поделиться тем, что нового появилось за это время.


Основные нововведения:



Читать дальше →
Total votes 16: ↑15 and ↓1 +14
Views 2.5K
Comments 0

Статический анализ: baseline файлы vs diff

Programming *Perfect code *Development Management *Product Management *

В статических анализаторах рано или поздно приходится решать задачу упрощения интеграции в существующие проекты, где поправить все предупреждения на legacy коде невозможно.


Эта статья — не помощник по внедрению. Мы будем говорить о технических деталях: как такие механизмы подавления предупреждений реализуются, какие у разных способов плюсы и минусы.


Читать дальше →
Total votes 22: ↑22 and ↓0 +22
Views 2.9K
Comments 3

gogrep: структурный поиск и замена Go кода

Open source *Designing and refactoring *Go *Software

gogrep — это одна из моих любимых утилит для работы с Go. Она позволяет находить код по синтаксическим шаблонам, фильтровать результаты по типам выражений, а также выполнять замену (тоже по шаблону).


В этой заметке я расскажу как использовать gogrep, а также о VS Code расширении для более удобной работы с gogrep прямо из редактора.


Читать дальше →
Total votes 27: ↑26 and ↓1 +25
Views 4.9K
Comments 2

Парсеры Пратта для чайников

Programming *Compilers *Go *

Рекурсивный спуск работает идеально, когда вы можете принимать решение относительно разбираемого куска кода с помощью текущего контекста и токена.


Картину портят выражения: постфиксные, инфиксные и прочие. Проблема: вы не можете понять, какого типа выражение вы обрабатываете до тех пор, пока не разберёте его первую половину. Зачастую для вас также важны приоритет операции и её ассоциативность, чтобы построенное AST имело правильную структуру.


В этой статье мы напишем парсер для диалекта Go, особенности которого мы рассмотрим чуть ниже. Как вы сможете убедиться, алгоритм Пратта решает большинство наших проблем.


Читать дальше →
Total votes 18: ↑16 and ↓2 +14
Views 5.9K
Comments 14

Что нужно знать, если вы хотите вызывать Go функции из ассемблера

Abnormal programming *Assembler *System Programming *Compilers *Go *
You've run into a really hairy area of asm code.
My first suggestion is not try to call from assembler into Go. — Ian Lance Taylor

До тех пор, пока ваш ассемблерный код делает что-то простое, всё выглядит неплохо.


Как только у вас возникает задача вызвать из ассемблерного кода Go функцию, один из первых советов, который вам дадут: не делайте так.


Но что если вам это очень-очень нужно? В таком случае, прошу под кат.


Читать дальше →
Total votes 28: ↑25 and ↓3 +22
Views 4.8K
Comments 14

ELFийские трюки в Go

Abnormal programming *Assembler *System Programming *Compilers *Go *


В этой заметке мы научимся получать машинный код Go функции прямо в рантайме, распечатаем его с помощью дизассемблера и по пути узнаем несколько фокусов вроде получения адреса функции без её вызова.


Предупреждение: ничему полезному эта мини-статья вас не научит.

Читать дальше →
Total votes 37: ↑35 and ↓2 +33
Views 9.5K
Comments 5

ruleguard: динамические проверки для Go

Open source *Perfect code *Compilers *Go *Development Management *


В этой статье я расскажу о новой библиотеке (и утилите) статического анализа go-ruleguard, которая адаптирует gogrep для использования внутри линтеров.


Отличительная особенность: правила статического анализа вы описываете на особом Go-подобном DSL, который на старте ruleguard превращается в набор диагностик. Возможно, это один из самых легко конфигурируемых инструментов для реализации кастомных инспекций для Go.


В качестве бонуса, мы поговорим об go/analysis и его предшественниках.

Читать дальше →
Total votes 21: ↑19 and ↓2 +17
Views 4.5K
Comments 16

Как добавить проверки в NoVerify, не написав ни строчки Go-кода

VK corporate blog Open source *PHP *Perfect code *Go *

В статическом анализаторе NoVerify появилась киллер-фича: декларативный способ описания инспекций, который не требует программирования на Go и компиляции кода.


Чтобы вас заинтриговать, покажу описание простой, но полезной инспекции:


/** @warning duplicated sub-expressions inside boolean expression */
$x && $x;

Эта инспекция находит все выражения логического &&, где левый и правый операнд идентичны.


NoVerify — статический анализатор для PHP, написанный на Go. Почитать о нём можно в статье «NoVerify: линтер для PHP от Команды ВКонтакте». А в этом обзоре я расскажу о новой функциональности и том, как мы к ней пришли.


Читать дальше →
Total votes 33: ↑33 and ↓0 +33
Views 3.9K
Comments 7

Ищем баги в PHP коде без статических анализаторов

Website development *Open source *PHP *Go *Development Management *

Моя самая любимая часть в статическом анализе кода — это выдвижение гипотез о потенциальных ошибках в коде с последующей их проверкой.


Пример гипотезы:


Функции strpos легко передать аргументы в неправильном порядке. 

Но есть вероятность, что даже на нескольких миллионах строк кода подобная диагностика не "выстрелит", поэтому на неудачные гипотезы тратить много времени не хочется.


Сегодня я покажу как выполнять простейший статический анализ с помощью утилиты phpgrep без написания кода.



Под катом:


  • Поиск и разбор багов в open source проектах.
  • Quick start по phpgrep.
  • Принцип работы синтаксического поиска.



Читать дальше →
Total votes 44: ↑41 and ↓3 +38
Views 11K
Comments 23

Дефективное встраивание функций в Go

High performance *Open source *System Programming *Compilers *Go *


Эквивалентен ли по производительности код, представленный ниже?


// (A). Вызов HasPrefix будет встроен.
return strings.HasPrefix(s, "#")
// (B). Ручное встраивание тела HasPrefix.
return len(s) >= len("#") && s[:len("#")] == "#"

Ответ: нет.


За подробностями и объяснениями прошу под кат.

Читать дальше →
Total votes 60: ↑56 and ↓4 +52
Views 8.9K
Comments 13

Сообщество Go в Казани и наши митапы

Self Promo


2-го декабря 2018 прошёл первый проведённый Казанским Go сообществом митап.
5-го января следующего года планируется провести следующий.


В этой статье немного расскажу о недавно созданном сообществе, наших планах, прошедшем митапе, а также о программе предстоящей встречи.

Читать дальше →
Total votes 16: ↑15 and ↓1 +14
Views 1.6K
Comments 0
1

Information

Rating
700-th
Works in
Registered
Activity