Компілятори, інтерпретатори… Скільки їм посвещено книг і проектів! Баста, набридло!
А ось сунешся в область аналізу природних мов, і ніякої інформації! А все якось дуже складно, незрозуміло і не універсально.
Була в мене ідея створити середньовічну лінгвістичну новелу. Щоб можна було розмовляти з персонажами на якому-небудь стародавньому природному або вигаданому мовою. На Латині наприклад? І на Квенья. І щоб вони розуміли. А чому б і ні?

Читати далі →

Трапилася непроста ситуація. Є код, написаний на С, який активно використовується через cgo в проекті, написаному на Go. У якийсь момент програма почала падати з помилками від malloc: то segfault, то memory corruption.

Логічна думка: потрібен valgrind з його memcheck, щоб перевірити, хто лізе поперек батька в пекло невалидную пам'ять. Однак, спроба згодувати валгринду бінарники, отриманий від go build, призведе тільки до розчарування — навіть на простому Hello World валгринд вибухне сотнями помилок і відправить розробника на відомі координати (спойлер: "Go fix your program!").

Це відбувається з-за того, що go runtime досить специфічний і значно відрізняється від такого в С. (Подробиці можна спокійно знайти за запитом «golang valgrind»).

Так як же нам розібратися, що відбувається?

Читати далі →

У світі .NET все чудово — платформа рухається в правильному напрямку, нові технології вдосконалюються і стають на ноги. Останнім часом багато розмов про .NET/ASP.NET Core, і здається, що всі забули про Roslyn, який надає широкі документовані можливості по роботі з кодом як під час рантайма, так і в процесі розробки.


Щоб виправити це, ми взяли інтерв'ю у Filip W, Microsoft MVP, контрибьютора Roslyn і просто одного з найбільш популярних у світі ASP.NET блогерів. Чому Filip вважає, що зміни в новому# можуть пройти непоміченими, навіщо писати власні аналізатори коду, а також чому скриптінг на C# краще, ніж будь скриптовом мовою?

Читати далі →

Як замкнути змінну в C# і не вистрілити собі в ногу

Ще в далекому 2005 з виходом стандарту C# 2.0 з'явилася можливість передачі змінної в тіло анонімного представника допомогою її захоплення (або замикання, кому як завгодно) з поточного контексту. В 2008 вийшов у світ новий стандарт C# 3.0, принісши нам лямбды, власні анонімні класи, LINQ запити і багато іншого. Зараз на дворі січень 2017 і більшість C# розробників з нетерпінням чекають реліз стандарту C# 7.0, який повинен привнести багато нових корисних «фіч». А ось фиксить старі «фічі», ніхто особливо не поспішає. Тому способів випадково вистрілити собі в ногу, як і раніше, вистачає. Сьогодні ми поговоримо про один з їх, і пов'язаний він з не зовсім очевидним механізмом захоплення змінних в тіло анонімних функцій у мові C#.

<img src=«habrastorage.org/getpro/habr/post_images/433/af9/b4a/433af9b4a44c643067f181b878f3631c.png» alt=«Picture » 1" />


Читати далі →

Обробка препроцессорных директив в Objective-C

Мова програмування с препроцессорными директивами складний для обробки, оскільки в цьому випадку необхідно обчислювати значення директив, вирізати непотрібні фрагменти некомпилируемого коду, а потім проводити парсинг очищеного коду. Обробка директив може здійснюватися також під час парсинга звичайного коду. Дана стаття описує обидва підходи стосовно мові Objective-C, а також розкриває їх переваги і недоліки. Ці підходи існують не тільки в теорії, але вже реалізовані і використовуються на практиці в таких веб-сервісах, як Swiftify і Codebeat.

Swiftify — веб-сервіс для перетворення вихідного коду на Objective-C в Swift. На даний момент сервіс підтримує обробку як окремих файлів, так і цілих проектів. Таким чином, він може заощадити час розробникам, бажаючим освоїти нову мову від Apple.

Codebeat — автоматизована система для підрахунку метрик коду і проведення аналізу для різних мов програмування, в тому числі і Objective-C.

Читати далі →

Як PVS-Studio шукає помилки: методики і технології

Що всередині у PVS-StudioPVS-Studio — статичний аналізатор вихідного коду для пошуку помилок і вразливостей в програмах на мові C, C++ і C#. У цій статті я хочу дати огляд технологій, які ми використовуємо в аналізаторі PVS-Studio для виявлення помилок в коді програм. Крім загальної теоретичної інформації я буду на практичних прикладах показувати, як та чи інша технологія дозволяє виявляти помилки.

Введення
Приводом для написання статті стало мій виступ з доповіддю на відкритій конференції ІСП РАН 2016 (ISPRAS OPEN 2016), що проходила в перших числах грудня в Головній будівлі Російської академії наук. Тема доповіді: «Принципи роботи статичного аналізатора коду PVS-Studio» (презентація у форматі pptx).

На жаль, час виступу було сильно обмежено, тому мені довелося підготувати досить коротку презентацію і не розповісти в доповіді багато чого з того, що хотілося. Тому я вирішив написати цю статтю, де більш детально розповім про те, які підходи і алгоритми ми використовуємо при розробці проекту PVS-Studio.

Читати далі →

Пишемо справжній Pointer Analysis для LLVM. Частина 1: Введення або перше побачення зі світом аналізу програм

Привіт, Хабр!

Ця стаття стане вступної у невеличкому циклі нотаток, присвяченому такій техніці аналізу програм, як pointer analysis. Алгоритми pointer analysis дозволяють з заданою точністю визначити на які ділянки пам'яті змінна або деякий вираз може вказувати. Без знання інформації про покажчиках аналіз програм, які активно використовують покажчики (тобто програм на будь-якій сучасній мові програмування C, C++, C#, Java, Python та інших), практично неможливий. Тому в будь-якому мало-мальськи оптимизируещем компіляторі або серйозному статичному аналізаторі коду застосовуються техніки pointer analysis для досягнення точних результатів.

В даному циклі статей ми зосередимося на написанні ефективного межпроцедурного алгоритму pointer analysis, розглянемо основні сучасні підходи до задачі, ну і, звичайно ж, напишемо свій серйозний алгоритм pointer analysis для чудового мови внутрішнього представлення програм LLVM. Всіх зацікавлених прошу під кат, будемо аналізувати програми та багато іншого!

Читати далі →

С++17 і С++2a: новини із зустрічі ISO в Иссакуа

На початку листопада в американському місті Иссакуа завершилася зустріч міжнародної робочої групи WG21 стандартизації C++ в якій брали участь співробітники Яндекса. На зустрічі «полірували» C++17, обговорювали Ranges, Coroutines, Reflections, контракти і багато іншого.

Засідання, як правило, займали цілий день + вирішено було скоротити обідню перерву на пів години, щоб встигнути більше попрацювати над C++17.

Незважаючи на те, що основний час було присвячено розбору недоліків чернетки C++17, кілька цікавих і свіжих ідей встигли обговорити, і навіть привнести в стандарт те, про що нас просили на cpp-proposals@yandex-team.ru.

Читати далі →

Пишемо свою мову програмування без мам, тат і бізонів. Частина 0: теорія

Тема написання свого ЯПа не дає мені спокою вже близько півроку. Я не ставив перед собою мету "вбити" CoffeeScript, TypeScript, ELM, тисячі їх, я просто хотів зрозуміти кухню і як вони взагалі пишуться.
До мого неприємного здивування, більшість з цих мов використовують Jison Bison JavaScript), а це не зовсім потрапляло під моє завдання — "зрозуміти", так як по суті справи Jison робить все за вас, збирає AST за заданими вами правилами (Jison як такий чудовий інструмент, який робить за вас левову частку роботи, але зараз не про нього).
зрештою я методом проб і помилок (а якщо сказати точніше, читання статей і реверс інжинірингу) навчився писати свої повноцінні мови програмування від розбиття вихідного тексту на лексеми до його трансляції в JS код.
Варто зауважити, що дане керівництво не прив'язане до JavaScript, він обраний виключно з міркувань швидкості розробки і читання, так що ви можете написати свій "лисп"/"пітон"/"ваш абсолютно новий синтаксис" на якому знайомому вам мовою.
Також до моменту написання компілятора (в нашому випадку транслятора), процес написання мови не відрізняється від процесів створення мов компилируемых ASM/JVM bitcode/LLVM bitcode/etc, а це означає, що дане керівництво не обмежується створенням мови трансляцируемого JavaScript.
Весь код, який буде написаний в даній (і наступних статтях), лежить на Github'е. Тегами позначені початок і кінці статей для зручності.

Читати далі →

.NET Tools. Інтерв'ю з Сергієм Шкредовым (JetBrains), Павлом Авсениным і Олександром Захаровим (DevExpress)


Деякі розробники програмують поглядом. Інші сліпі і програмують на слух\дотик. Окремим товаришам досить маркера і дошки. Але все-таки більшість .NET розробників користується Visual Studio для кодування і дебага, парочкою профайлеров, декомпилятором, плагіном для VCS, браузерних інструментами, R#\CodeRush, тулзой для контролю бази даних, баг-трекером, білд-системою і кавоваркою.
Мені вдалося поговорити з розробниками деяких з перерахованих засобів розробки.
Під катом — нудна і зовсім нецікава реклама, трохи Roslyn, трохи Rider, мінімум CodeRush, малість описані фічі C# 7.0, побіжно розглянуті перспективи .NET і один раз згадується PVS-Studio.

Читати далі →