ManagerClass - компилятор как компонент
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.10 19:43
Оценка:
Всем привет.

Просьба к тем у кого есть свободное время заняться простенькой но нужной задачей...

Нужно сделать удобную и простую в использовании обертку над ManagerClass позволяющую в 2-3 строчки создать компилятор как объект в памяти и скомпилировать им некоторые исходники.

Этот компонент должен иметь внятный и компактный интерфейс, а так же скрывать все детали вроде увеличения размера стека.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: ManagerClass - компилятор как компонент
От: Ziaw Россия  
Дата: 20.12.10 04:52
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Нужно сделать удобную и простую в использовании обертку над ManagerClass позволяющую в 2-3 строчки создать компилятор как объект в памяти и скомпилировать им некоторые исходники.


VD>Этот компонент должен иметь внятный и компактный интерфейс, а так же скрывать все детали вроде увеличения размера стека.


Я бы попросил добавить контракты для компиляции PExpr.
Re[2]: ManagerClass - компилятор как компонент
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.12.10 15:20
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Я бы попросил добавить контракты для компиляции PExpr.


Компиляция не может происходить в астрале. Нужен конкретный контекст: метод, проект и т.п. Так что просто компилировать PExpr нельзя. Можно сделать возможность получать тайпер верхнего уровня, а уже у него есть методы TypeExpr(). Но при компиляции в рамках некоторого макроса нужно использовать текущий тайпер.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: ManagerClass - компилятор как компонент
От: Ziaw Россия  
Дата: 20.12.10 17:17
Оценка:
Здравствуйте, VladD2, Вы писали:

Z>>Я бы попросил добавить контракты для компиляции PExpr.


VD>Компиляция не может происходить в астрале. Нужен конкретный контекст: метод, проект и т.п. Так что просто компилировать PExpr нельзя. Можно сделать возможность получать тайпер верхнего уровня, а уже у него есть методы TypeExpr(). Но при компиляции в рамках некоторого макроса нужно использовать текущий тайпер.


Да нет, смысл в том, чтобы получить аналог LamdaExpression.Compile(), даем экспрешен, получаем функцию. Контекст для этого компонент компилятора должен сделать самостоятельно.
Re: ManagerClass - компилятор как компонент
От: xtrevius  
Дата: 20.12.10 17:17
Оценка: 50 (1)
Здравствуйте, VladD2, Вы писали:

VD>Этот компонент должен иметь внятный и компактный интерфейс, а так же скрывать все детали вроде увеличения размера стека.


Нужно что-то типа такого?

  Скрытый текст
public class CompilerManager
  {
      _options : CompilationOptions;
      public ManagerClass : ManagerClass;
      
      Run():void
      {
          def thread = System.Threading.Thread(
                        fun()
                        {
                            unless(this.ManagerClass==null) this.ManagerClass.Run()
                        },
                        10*1024*1024*System.IntPtr.Size);
          thread.Start();
          thread.Join();
      }
      
      public this()
      {
          _options = CompilationOptions();
          _options.LibraryPaths = [Environment.GetEnvironmentVariable("Nemerle")];
          this.ManagerClass = ManagerClass(_options);
      }
      
      public MacrosToLoad : list[string]
      {
          get { _options.MacrosToLoad }
          set { _options.MacrosToLoad = value}
      }
      
      public LibraryPaths : list[string]
      {
          get { _options.LibraryPaths }
          set { _options.LibraryPaths = value }
      }
      
      public ReferencedLibraries : list[string]
      {
          get { _options.ReferencedLibraries }
          set { _options.ReferencedLibraries = value }
      }
      
      public Compile(sources : list[string],targetIsExe:bool=false) : Assembly
      {
          Compile(sources,null,targetIsExe);
      }
      public Compile(sources : list[string],outputFile : string) : Assembly
      {   
          Compile(sources,outputFile,if(System.IO.Path.GetExtension(outputFile) == "exe") true else false);
      }
      
      public Compile(sources : list[string],outputFile : string,targetIsExe : bool) : Assembly
      {
          _options.Sources = sources;
          _options.TargetIsWinexe= targetIsExe;
          _options.TargetIsLibrary = !targetIsExe;
          if(!string.IsNullOrEmpty(outputFile))
          {
              _options.CompileToMemory = false;
              _options.OutputFileName = outputFile;
          }
          else
          {
              _options.CompileToMemory = true;
          }
          Run();
          this.ManagerClass.GeneratedAssembly
      }
}
Re[2]: ManagerClass - компилятор как компонент
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.12.10 22:35
Оценка:
Здравствуйте, xtrevius, Вы писали:

X>Нужно что-то типа такого?


Что-то вроде, только не надо убирать опций компиляции. Это важная вещь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: ManagerClass - компилятор как компонент
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.12.10 22:43
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Да нет, смысл в том, чтобы получить аналог LamdaExpression.Compile(), даем экспрешен, получаем функцию. Контекст для этого компонент компилятора должен сделать самостоятельно.


Т.е. на выходе лямбду делать? Это можно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.