love5an: (Default)
Как наверное некоторые знают, одной из самых близкий и интересных мне тем в области программирования, и CS вообще, является синтаксический анализ.

В свободное время, как я уже писал, я занимаюсь разработкой своего языка программирования, основанном на Common Lisp, и одна из тем, которая меня очень сильно интересует это расширяемый синтаксис.
Read more... )
love5an: (Default)
Скрепя сердце, с сожалением и горечью, но тем не менее, движимый рациональным подходом к делу, перевел код программы для своего стартапа с Common Lisp на Microsoft .NET, а именно на C#.

Причины довольно банальны и прозаичны.

Первые две, в принципе, связаны, и хотя одну из них можно было бы компенсировать другой, у CL проблемы с обеими:


  1. Недостаток инфраструктуры. Ни для кого ни секрет, что у CL довольно неслабые проблемы с библиотеками, начиная со стандартной, и особенно с библиотеками под Windows. В принципе, это всё дело решаемое, и я бы мог для своего проекта написать всё сам, но, тем не менее, прикинув в голове, сколько бы это заняло усилий, и сколько бы родилось велосипедов, я от этого отказался. У .NET с другой стороны, инфраструктура даже стандартной библиотеки(BCL) просто огромна, и покрывает не только минимум вроде, например, I/O или работы с кодировками, но и более сложные и абстрактные вещи(см. пункт 4), и я уже не говорю про платформы для графического интерфейса(WPF, WinForms). В принципе, не будь второй проблемы, эта конкретная была бы не помехой. А вторая проблема такая:

  2. Недостаток специалистов со знанием CL. Проблема тоже довольно известная, и, к сожалению, стоящая очень остро. В моем случае - из всех подключенных к делу людей, с Common Lisp до такого уровня, чтобы писать на нем "production quality" код, знаком только я. Будь специалистов больше, как я уже сказал, проблема с инфраструктурой не стояла бы так остро.

  3. Порт SBCL под Windows, похоже, заброшен. Последний коммит был 4 месяца назад :( https://github.com/akovalenko/sbcl-win32-threads

  4. Linq Expression Trees. В .NET 3.5 Microsoft ввели такую сумасшедшую штуку, которая рядовыми программистами практически не используется, но которая очень полезна и необходима таким заклиненным на всяких лиспах людям, как я. Linq Expression Trees это инструмент для кодогенерации в рантайме. Они позволяют составлять AST(абстрактное синтаксическое дерево) из "выражений", компилировать его и запускать. Фича эта для моего проекта крайне необходимая, так как один из основных компонентов программы - генератор и компилятор packrat-парсеров из PEG.
    Вот небольшой пример, для сравнения с CL:

    (let* ((code `(lambda (x y) (+ x y)))
           (f (compile nil code)))
      (print (funcall f 1 2)))
    
    ;; ==> 3
    


    На C#, с использованием Linq Expression Trees будет так:

    using System;
    using System.Linq.Expressions;
    
    class Program
    {
      static void Main()
      {
        var xParam = Expression.Parameter(typeof(int), "x");
        var yParam = Expression.Parameter(typeof(int), "y");
        var body = Expression.Add(xParam, yParam);
        var code = Expression.Lambda(body ,xParam, yParam);
        var f = code.Compile();
        Console.WriteLine(f.DynamicInvoke(1, 2));
        // ==> 3
      }
    }
    

  5. C# довольно неплохой язык, хоть и не CL. В частности, в C# 4.0(а это теперь основной инструмент разработки) существует множество интересных фич, которые приближают его к таким мощным инструментам, как мой любимый Common Lisp. Здесь я имею ввиду возможности самого языка - начиная с анонимных делегатов и лямбд и заканчивая "dynamic", который фактически вводит в C# простенький аналог мультиметодов CLOS. Кстати, у кого-нибудь, возможно, может возникнуть вопрос "почему не на Java и JVM?" - так вот в том числе и поэтому. .NET и C# объективно удобнее и мощнее JVM и Java.


Такая "смена рельс" тем не менее не означает отсутствие в программе встроенного лиспа, о котором я писал ранее. Я планирую реализовать его сначала как интерпретатор, а потом, смотря по ситуации и по материальным, моральным и т.п. ресурсам, возможно и как компилятор в MSIL, а потом возможно и как компилятор в native-код.
love5an: (Default)
Я тут недавно опять думал про неймспейсы, в контексте лиспа, и, внезапно, меня осенило:


(defstruct symbol
  (name     "" :type string)
  (children () :type list)
  ...)

love5an: (Default)
Как известно, система пакетов Common Lisp является одним из его наиболее "слабых" и наименее продуманных мест.

Так вот, я тут думаю, какую бы систему неймспейсов добавить в свой Microlisp(и соответственно, во встроенный лисп, используемый в программе, которую я пишу для стартапа).

И вот такой возник вопрос:
Какая система разрешения имен неймспейсов вам кажется более удобной, логичной и продуманной:

Как в C++ или как в C#?

Конкретно, вот что я имею ввиду:
Read more... )
love5an: (Default)
(впрочем win64 потребует только замены машинных слов на восьмибайтовые, насколько я понимаю).

Последние полнедели старался дойти до того, как таки реализовать в Microlisp CL-подобную семантику escaped continuations если компилировать в машинные коды.

Пытался разобраться в сорцах SBCL на эту тему, кое-что понял, но в целом там все очень сложно.

Суть такова: на Windows для реализации и UNWIND-PROTECT, и THROW/CATCH, и остальных операторов из этой оперы, можно использовать Windows Structured Exception Handling(сокращенно SEH), механизм обработки исключений, встроенный в ядро операционной системы.

Более того, как я когда-то говорил, SEH практически полностью повторяют семантику escaped continuations CL, и соответственно, использование SEH для реализации control flow на Windows это лучший и самый очевидный выбор.
Read more... )
love5an: (Default)
Ну и небольшой драфт языка, вообще.

Репозиторий на гитхабе тут(если кто прошлый постинг еще не читал):
https://github.com/Lovesan/Microlisp

Read more... )

Microlisp

Dec. 12th, 2011 07:36 pm
love5an: (Default)
Совершенно от нефиг делать: https://github.com/Lovesan/Microlisp

Буду коммитить на гитхаб по ходу разработки, вобщем. Кому интересно написание интерпретаторов и компиляторов Common Lisp-подобных языков — фоловите.

Планы такие - дописать XI(кросс-интерпретатор, написанный на CL), потом написать компилятор на самом микролиспе, потом им скомпилировать рантайм, стандартную библиотеку и самого себя.
Ну то есть, без всяких там Си.

Profile

love5an: (Default)
Dmitry Ignatiev

December 2016

S M T W T F S
    123
45678910
11121314 151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 24th, 2017 02:31 am
Powered by Dreamwidth Studios