• Как делаются скриптовые языки программирования?

    Короткий ответ: читаем книгу дракона. Есть и более навороченная литература, но начинают все с этой книги (нам по ней читали в универе курс трансляции языков).

    Длинный ответ: ваш транслятор принимает на вход последовательность символов (допустим, UTF-8 текст), "понимает" ее в соответствии со спецификацией вашего языка, и выплевывает в качестве вывода инструкции на другом языке (в виде текстового файла или файла спец. формата). Этим "друим языком" может быть язык ассемблера какой-то железной платформы (x86_64, ARM, SPARC), и результирующим файлом будет бинарник под указанную архитектуру (точнее - объектный модуль, бинарник потом будет собран линковщиком) - так компилятся, например, C/C++. "Другим языком" может быть язык виртуальной машины (LLVM/байткод Java/MSIL) - так компилятся С/C++ (если через LLVM), Java, Scala, C#, F#, VB. "Другим языком" может быть и более высокоуровневый язык - часто, чтобы не париться на начальных этапах развития языка генерацией машинного кода, делают транслятор, который генерит код на Си, и этот код на Си уже компилят известным компилятором в бинарник. Или к примеру, CoffeeScript/TypeScript транслируются в JavaScript, т.к. веб-браузеры кроме джаваскрипта исполнять пока ничего не умеют.

    Конечно же, вы можете написать интерпретатор, а не компилятор - тогда ваша программа будет сразу же исполнять инструкции на вашем языке, не генерируя какой-либо выходной файл. Так поступают довольно много систем, например Node.js. Python делает также, если отключить генерацию pyc-файлов (поправьте меня, если я ошибаюсь).

    На каком языке реализовать сам транслятор - не имеет особого значения. Более того, хорошим тоном считается реализовать на разрабатываемом языке компилятор этого же языка - это называется self-hosting. Обычно наличие компилятора языка на этом же языке считается первым этапом серьезного отношения к языку. Разумеется, первую версию компилятора нужно будет реализовать на уже существующем языке (или сделать bootstrapping, если уж вы совсем суровый разработчик).

    Т.к. в задачах разбора входного потока (parsing) уже набито очень много шишек, и люди посвятили свои жизни и научные карьеры изучению этого вопроса, то сделано и немало инструментов для помощи в разработке компилятора. Как правило, такие инструменты дают возможность описать грамматику вашего языка на некоем специализированном синтаксисе (вроде BNF), а потом по этому описанию генерят вам код лексера и парсера на удобном для вас языке (это модули, которые выполнят первичный разбор входного потока на вашем языке на токены, и построят абстрактное синтаксическое дерево (AST)). А вы уже дописываете к ним основную часть вашего компилятора. Как пример, при написании компиляторов на языке Си часто используют flex в связке с yacc/bison. Есть более комлексные пакеты, позволяющие генерить код парсеров на различных языках - ANTLR, GOLD. А можно и самому написать лексер и парсер, особенно если вы уже сделали первую версию компилятора и переписываете его на вашем же языке).
    Ответ написан
    Комментировать
  • Есть ли бесплатное решение для экспорта из MS Excel в HTML таблицы на C#?

    Nipheris
    @Nipheris Куратор тега C#
    Какие-то сложные советы вам дали тут). Если вам не нужно особо навороченное форматирование, берите EPPlus и читайте Экселевский файл. Все что прочли - сами отрендерите в html. А в идеале лучше сделать два выходных конвертера для отчета - один, который сохраняет в Excel, а другой - в HTML, чтобы не играть в испорченный телефон.
    Не надо ничего декомпилировать и затирать, если библиотека платная, на то есть причины, пока все будут так делать, никто не будет относиться к бизнесу из России как к адекватному.
    Ответ написан
    Комментировать
  • Как скомпилировать проект Visual Studio 2015 под VЫ2010?

    Nipheris
    @Nipheris Куратор тега C#
    1) убедиться, что все зависимости имеют версии для .net 4.0 или ниже
    2) переделать те места в коде, которые используют фичи C# > 4.0
    3) сменить версию целевого .net framework на 4.0 в свойствах проекта
    Ответ написан
    2 комментария
  • Зачем нужны делегаты в C#?

    Nipheris
    @Nipheris Куратор тега C#
    Дмитрий Ковальский прав, с предыдущего вопроса не прошло и недели.

    Если того что там есть вам мало, зайдем с практической стороны. Вы пишете для меня библиотеку и я прошу вас сделать мне функцию обхода графа по ПВШ/ПВГ, которая будет вызывать для каждой вершины некоторое действие (заранее неизвестное). Я хочу чтобы сделали именно обход, а что делать с каждой вершиной я хочу решать сам во время использования. В идеале, хотелось бы передавать вам это "действие" для каждой вершины как параметр в функцию обхода. Как вы решите эту задачу?
    Ответ написан
  • Какие существуют алгоритмы для раскрытия скобок в выражении?

    Nipheris
    @Nipheris Куратор тега C#
    Да распарсите это дело в AST и освобождайте от чего хотите. Можно, например, расчитать константные выражения (заменить (3 + 4) на 7). Скобки убрать еще проще - если у узла один потомок (выражение в скобках) - заменить текущий узел на потомка.
    Ответ написан
    Комментировать
  • Как организовать структуру базы данных для динамических характеристик?

    Как добавить товар в корзину?

    - EAV (ссылку дал @muhammad_97);
    - JSON/XML в реляционной базе;
    - JSON в документной базе (CouchDB/MongoDB) (предпочтительный вариант);
    Ответ написан
  • Какое ПО использовать для написания книг?

    Кстати, если научная книга и много формул/математики - то Latex+Git. Как говорится, тяжело в учении, легко в бою. Больше конечно подходит для статей, но потенциал у связки очень большой.
    Ответ написан
    Комментировать
  • Как добавить ссылку на библиотеку классов в проект, чтобы все ссылки из этой библиотеки автоматически добавились?

    Nipheris
    @Nipheris Куратор тега C#
    Вам не нужно добавлять ссылки на все транзитивные зависимости, что у вас есть.
    Ссылаться нужно только на те сборки, что вы непосредственно используете в коде ссылающейся сборки.
    На самом деле у вас проблема с процессом билда проекта. Решить ее можно разными способами, лучший вариант - плотно работать с NuGet и брать все зависимости оттуда. Т.к. с зависимостями у NuGet все в порядке, то очень удобно и свои библиотеки собирать как NuGet-пакеты, тогда указанных вами проблем просто не будет в принципе.
    Вообще, вон скоро DNX допилят, ее система проектов как раз была передалана для использования пакета как основной сущности для сборки и деплоя. Эту систему проектов вполне можно применять и для не-веб проектов, осталось только дождаться релиза.
    Ответ написан
    Комментировать
  • Почему методы нельзя передавать в функции без делегатов?

    Nipheris
    @Nipheris Куратор тега C#
    Делегаты - это форма существования функтора на платформе .NET. Почитайте про функтор, и поймете (наверное), зачем нужен делегат.

    Если коротко и грубо - вызвать напрямую можно всегда только конкретный метод, который будет четко известен еще на стадии компиляции. Если же вы пишете некий обобщенный алгоритм и заранее не знаете, какие КОНКРЕТНО методы у каких КОНКРЕТНО объектов будете вызывать - вам необходимо будет воспользоваться делегатом.
    Простейший пример - LINQ-методы. Метод фильтрации Where получает своим параметром функтор, который возвращает true или false, что значит - оставить элемент в коллекции или выкинуть его. В этом методе в цикле foreach вызывается переданный делегат для каждого элемента. Where понятия не имеет, какой конкретно метод (или лямбда-выражение) вы захотите подставить в качестве фильтрующего предиката.

    Другой пример - события. События в дотнете - это делегаты с урезанным публичным интерфейсом. Так как, к примеру, кнопка не знает о том, кто захочет подписаться на событие ее нажатия, она никак не может вызвать конкретные методы у конкретных объектов. Чтобы иметь возможность сообщать о своем нажатии, кнопка выставляет событие Click наружу, давая возможность записать туда конкретные методы для вызова.

    Кстати, делегат выполняет еще и функцию связывания: для нестатических методов делегат хранит еще и объект, для которого будет вызван instance-метод (т.е. связывает пару объект-метод).

    Таким образом,
    > Почему методы нельзя передавать в функции без делегатов?
    Делегаты - это и есть передача методов в функции.
    Ответ написан
    Комментировать
  • Как правильно спроектировать базу; консистентность данных?

    > и для каждого из них есть уникальные поля
    А как этими полями будут пользоваться? Группировки/фильтры/агрегация по ним будут?
    Если будут, то тогда действительно 20 таблиц (и это нормально, т.к. тогда и кода для каждого типа пользователя у вас будет достаточно). И паттерны наследования - concrete table, single table, class table.
    Если не будут (т.е. эти поля будут читаться/писаться целиком) - может в JSON поле их?
    Ответ написан
    Комментировать
  • Какие файлы можно удалить из папки Debug?

    Nipheris
    @Nipheris Куратор тега C#
    Во-первых для дальнейшего использования программы вам нужно скомпилировать ее в конфигурации Release. Какие дефолтовые настройки стоят для каждой из конфигураций можно посмотреть в файле проекта.

    *.pdb это не странные файлы, а отладочная информация, если я не ошибаюсь, в Release конфигурации они по-дефолту не создаются. Если все таки они есть - можете спокойно их удалять.
    .vshost.exe.* - это файлы помощника студийного дебаггера. Для самостоятельной работы программы они также не нужны.
    .exe.config - потребность в этом файле зависит от того, что в нем написано. Если не понимаете, что там - лучше оставить его и поставлять с программой (там, например, могут быть редиректы версий сборок).
    *.xml - если это не ваши xml-ки, то обычно это автосгенеренная документация. Если у вас приложение, а не библиотека, можете убрать их из поставки.

    Насчет остального должны знать сами. А вообще, изучайте инструмент, которым пользуетесь, если уже дошли до этапа поставки приложения (если конечно у вас не лабораторка там :) )
    Ответ написан
    Комментировать
  • Как послать http запрос через OpenVpn c#?

    Nipheris
    @Nipheris Куратор тега C#
    Армянское Радио абсолютно прав, если у вас маршруты настроены как надо, то нужный траф и так пойдет по vpn, а если не как надо - то их надо настроить. Это обычно делается независимо от приложений, которые будут общаться по сети, это делает администратор либо в конфиге openvpn, чтобы последний отдавал нужные роуты клиенту при подключении, либо вручную в каком-нибудь батнике, который юзер запускает после подключения.

    Отдельный вопрос, если вы хотите управлять маршрутами из вашей программы. Это возможно, но я сильно не уверен, что вам это нужно. Обычно такое нужно если у вас много различных конфигураций vpn и вам нужно по какому-нибудь хитрому алгоритму без участия юзера выбирать, по какому vpn-каналу отправлять трафик.
    Ответ написан
    2 комментария
  • В чем плюсы и минусы классов и библиотек?

    Nipheris
    @Nipheris Куратор тега C++
    Классы, как и процедуры/функции - это простейшие кирпичи для построения дома. Библиотеки - это когда вам подгоняют готовую кухню/ванную или водопровод, который вы встраиваете в ваш дом.

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

    В целом я понял вопрос как "зачем нужны гайки и болтики, если я могу сделать мотор или купить его у мотозавода?". А вы/мотозавод, собственно, из чего будете мотор собирать?
    Ответ написан
    Комментировать
  • Что представляет собой ссылка?

    Nipheris
    @Nipheris Куратор тега C++
    Ну конечно что ждет от вас препод, нам тут все равно не угадать. Я бы как раз и ответил, что это имя для переменной. Я не соглашусь с некоторыми ответами здесь, т.к. не всегда для ссылки компилятор будет выделять память - локальная ссылка на локальную же переменную как раз таки будет просто вторым именем в таблице идентификаторов компилятора при компиляции программы.

    Главная фишка ссылки в том, что это абстрактное l-value, т.е. сущность, в которую можно что-то присвоить (если базовый тип - не константный). То есть ссылка всегда оборачивает какой-либо адрес в памяти, причем на время жизни ссылки этот адрес постоянен (ссылку нельзя "переставить" на другую область памяти). Именно поэтому ссылки всегда нужно инициализировать.
    ЧЕМ инициализировать - другое дело. Можно переменной, а можно - разыменованным указателем.

    В зависимости от ситуации технически ссылка может быть реализована по-разному. Если это ссылка на лок. переменную, то большинство компиляторов просто добавят себе новое имя в таблицу. Никакой дополнительной памяти выделяться не будет. Если же ссылка приходит как параметр или отдается как возвращаемое значение - то тут скорее всего понадобится реализовать ее как указатель (указатель передавать/возвращать). Однако, еще раз напомню: ссылка скрывает технические подробности, вы с ней работаете как с обычной переменной. Более того, она скрывает настолько, что даже может продлевать жизнь временным объектам.

    Теперь попробуем сранить ссылку и другие сущности в языке.
    Определение ссылки vs определение обычной переменной:
    определение обычной переменной это всегда выделение памяти и добавление нового имени в таблицу компилятора для этой области памяти. Определение ссылки - это прежде всего ОПРЕДЕЛЕНИЕ ИМЕНИ, а уже в тех случаях, когда привязку этого ИМЕНИ к АДРЕСУ невозможно осуществить во время компиляции (т.е. например в случае передачи ссылки как параметра функции), то для реализации ссылки применятся указатель. Важно, что компилятор сам выбирает способ реализации поведения ссылки. В любом случае, назначение ссылки - обернуть в l-value уже ВЫДЕЛЕННУЮ память (совершенно не важно, на стеке, куче или где-то еще). Новой памяти для хранения значения целевого типа НЕ выделяется. Если у вас есть переменная и ссылка/несколько ссылок на нее, то при присвоении значения через любую из сущностей вы будете менять одну и ту же область памяти.

    Ссылка vs указатель:
    - самое важное отличие - указатель САМ ПО СЕБЕ является переменной. Под указатель int* компилятор выделит память также, как и под int. Указатель существует сам по себе, ему (если он не const) можно присваивать новые значение, можно присвоить nullptr. Можно даже хранить в нем совершенно некорректный адрес и все будет ок до тех пор, пока вы не разыменуете его. Только когда вы разыменовываете указатель, вы превращаете его в l-value, и с этого момента между ним и ссылкой разницы нет.
    - второе отличие - собственно необходимость разыменования. Т.к. указатель - самостоятельная переменная, для обращения по адресу, на который указатель смотрит, нужно сделать ему *p. Именно в этот момент компилятор начинает рассматривать значение указателя как адрес в памяти, с которым вы собираетесь что-то сделать (если быть совсем точным, но не в момент разыменования, а при попытке чтения/записи. В принципе вы можете даже инициализировать ссылку некорректным указателем, и программа не упадет, пока вы не попытаетесь читать/присваивать по этой ссылке).
    - с учетом сказанного, ссылку можно грубо считать "константым указателем с автоматическим разыменованием". Грубо, т.к. согласно стандарту есть нюансы, такие как вышеупомянутое продлевание жизни временным объектам.
    Ответ написан
    Комментировать
  • Как вернуть файлы?

    Чет так и не понял в чем проблема.. Если папка скрытая - то включи отображение скрытых папок, если к папке нет доступа, то открой командную строку в этой папке, и
    cacls *.* /T /G ALL:F
    Ответ написан
    3 комментария
  • Как расшифровать https?

    Можно, либо получаете доступ к инфраструктуре сервиса и ковыряете трафик еще до отправки клиенту, либо ставите на клиента поддельный корневой сертификат, и можете пускать трафик через себя. Посмотрите как делает Fiddler на локальной машине, чтобы перехватывать HTTPS трафик. Если вы сможете установить липовый сертификат, то сможете и перешифровывать на middle-стороне трафик, создавая иллюзию нормального HTTPS соединения.
    Ответ написан
    Комментировать
  • Плохо ли если класс самодостаточен, в плане получения каких то данных необходимых для его полноценной работы?

    Nipheris
    @Nipheris Куратор тега C#
    Зависит от того, какую ответственность вы "отдаете" в класс. Если это так называемый "value object", т.е. некий неизменяемый композит, то лучше ему в конструктор передать сразу готовые значения. Если же это самостоятельный объект с внятным жизненным циклом и определенной ответственностью - тогда конечно логично чтобы он сам брал данные из репозитория.
    Вам нужно почитать про Dependency Injection - это как раз та "середина" между двумя альтернативами, что вы предложили в виде фрагментов кода. Обращаться к глобальном объекту репозитория - это также антипаттерн. Гораздо лучший вариант - это когда объекту при создании передается (!) репозиторий в конструкторе, а объект уже САМ делает выборки необходимых данных. Это как раз и есть удачный вариант спуска от общего к частному. Плюс, вся логика сосредоточена в классе - я всегда могу добавить новую Модель (если следовать вашим примерам), которая также берет репозиторий, но вытаскивает из него уже ДРУГИЕ сведения.
    Вот стандартный туториал, в котором роль вашего "класса" выполняет ASP.NET-контроллер, и он получает репозиторий в конструкторе: www.asp.net/web-api/overview/advanced/dependency-i...

    Вообще принцип всегда такой - если есть некоторая переменная или значение, то есть N точек, из которых можно получить к ней доступ. Чем меньше этих точек - и при этом вы можете без извращений реализовать нужную вам бизнес-логику - тем лучше. И чем ближе в коде эти точки расположены друг к другу - тем лучше. Всегда удобнее работать с кодом, когда данные конкретной сущности и логика их обработки умещаются хотя бы в одном файле.
    Ответ написан
    3 комментария
  • Почему выводятся адреса, а не значения?

    Nipheris
    @Nipheris Куратор тега C++
    Я думаю там выводится мусор, а не адреса - с чего вы взяли, что там адреса? Они последовательно идут? Я не думаю.

    *(a-i);//перевести указатель на первый эллемент


    Не, тут не произойдет то что вы пишете. Здесь нет операции присвоения или аналогичной ей. Это просто выражение, результат вычисления которого уйдет в никуда. Совершенно непонятно, зачем вы еще и разыменование поставили. Вы вообще понимаете, что написали там?
    Вам нужно что-то вроде этого: a = npa; или a -= i;
    Ответ написан
    2 комментария
  • Какую СУБД лучше выбрать?

    Соглашусь с Дмитрий Авилов - если выборка по единственному ключу, то рел. СУБД ни к чему. Монга не единственное возможное решение, поэкспериментируйте с другими NoSQL базами.
    Ответ написан
  • Как исправить ошибку windowsSDKdir при сборке проекта в yeoman genrator?

    Собирать надо из командной строки "Developer Command Prompt", а не из обычной. Девелоперская консоль добавляет в PATH пути к тулчейну. Очевидно, сейчас msbuild никак не может найти CL.exe.

    Разберитесь сначала с этим, а потом посмотрим, надо ли вам WindowsSDKDir.
    Ответ написан
    1 комментарий