русский
Germany.ruForen → Архив Досок→ Programmierung

Компиляция из потока?

826  1 2 alle
Murr патриот20.06.24 00:11
Murr
NEW 20.06.24 00:11 

Компиляция из потока?


Если кто работал с компилятором из командной строки, то там есть местечко для списка компилируемых файлов.

Детали не помню, но не суть.


Меня интересует не видел ли кто варианта компиляции когда список не определен, а файлы получаются последовательно из COM/USB/NET источника?

#1 
MrSanders коренной житель20.06.24 07:37
NEW 20.06.24 07:37 
in Antwort Murr 20.06.24 00:11

Чтобы фаилы - не видел. А один файл gcc из stdin обрабатывает. Надо было только язык указывать, а то имени с расширением нет.

#2 
AlexNek патриот20.06.24 18:58
AlexNek
NEW 20.06.24 18:58 
in Antwort Murr 20.06.24 00:11

Очень подозреваю что нет.

А не вариант записать на виртуальный диск в памяти?

Ну или на stdin перенаправить, но тогда видимо будут отдельные файлы а не проект.

#3 
Murr патриот20.06.24 21:29
Murr
NEW 20.06.24 21:29 
in Antwort MrSanders 20.06.24 07:37

увы - не работает одним файлом - если сцепить весь набор, то в .Нете ошибки компиляции посыпятся.

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

язык - не проблема - его надо сообщать генератору.


блин, раньше было проще - исходный файл (копиляция) объектный файл (линковка) длл/ехе...

#4 
Murr патриот21.06.24 02:07
Murr
NEW 21.06.24 02:07 
in Antwort AlexNek 20.06.24 18:58

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

Даже результат писать не хочется - его тоже можно отдать в выходной поток... на другой хост...

#5 
AlexNek патриот21.06.24 19:52
AlexNek
NEW 21.06.24 19:52 
in Antwort Murr 21.06.24 02:07

Что то типа этого? Или нет?

https://learn.microsoft.com/en-us/troubleshoot/developer/v...

#6 
Murr патриот22.06.24 00:50
Murr
NEW 22.06.24 00:50 
in Antwort AlexNek 21.06.24 19:52

Не знаю - надо ковырять CompileAssemblyFromSourceBatch

втотой параметр перегрузить - если там IEnumerable

может прокатит'

#7 
Murr патриот22.06.24 14:26
Murr
NEW 22.06.24 14:26 
in Antwort Murr 22.06.24 00:50

не, не прокатывает - только string[]...

Надо поковырять имплементацию ToArray()

#8 
AlexNek патриот22.06.24 15:02
AlexNek
NEW 22.06.24 15:02 
in Antwort Murr 22.06.24 00:50
если там IEnumerable

А зачем, места в памяти не хватит?

Compiles an assembly from the specified array of strings containing source code, using the specified compiler settings.

https://learn.microsoft.com/de-de/dotnet/api/system.collec...

public T[] ToArray ()

#9 
AlexNek патриот22.06.24 15:03
AlexNek
NEW 22.06.24 15:03 
in Antwort Murr 22.06.24 14:26
Надо поковырять имплементацию ToArray()

А там что не хватает? смущ

#10 
Murr патриот22.06.24 16:24
Murr
NEW 22.06.24 16:24 
in Antwort AlexNek 22.06.24 15:02

Так процесс по определению - последовательный - файл за файлом...

ну а мне нужно - поток за потоком.

и - да - Я не знаю сколько гиг или терр поступит.

#11 
Murr патриот22.06.24 16:35
Murr
NEW 22.06.24 16:35 
in Antwort AlexNek 22.06.24 15:02

ЗЫ. Проблема в том, что требуется передать подготовленный массив строк - со всеми текстами внутри - столько памяти точно не будет.

Остальные методы тоже требуют полной подготовки.


А вот подпихнуть вместо массива что другое - что будет поставлять файлики по мере необходимости/получения - у меня пока не получается.

#12 
AlexNek патриот22.06.24 17:25
AlexNek
NEW 22.06.24 17:25 
in Antwort Murr 22.06.24 16:24
и - да - Я не знаю сколько гиг или терр поступит.

и считаешь, что компайлер тоже без диска работает? смущ

https://learn.microsoft.com/en-us/dotnet/framework/reflect...

Это же сколько мусора нужно нагенерить для таких размеров?


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

https://github.com/dotnet/runtime

#13 
Murr патриот22.06.24 19:21
Murr
22.06.24 19:21 
in Antwort Murr 22.06.24 16:35

Что собаки бешенные делают...

Старался - минимизировал, разместил в памяти, отдаю компилятору...


А они первым делом скидвают все на диск....... кааааааазззззззззззлыыыыыыыыыыыыыыыы

[ResourceExposure(ResourceScope.None)]
[ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]
private CompilerResults FromSourceBatch(CompilerParameters options, string[] sources)
{
if (options == null)
{
throw new ArgumentNullException("options");
}
if (sources == null)
throw new ArgumentNullException("sources");

new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand();

string[] filenames = new string[sources.Length];


CompilerResults results = null;
#if !FEATURE_PAL
// the extra try-catch is here to mitigate exception filter injection attacks.
try
{
WindowsImpersonationContext impersonation = Executor.RevertImpersonation();
try
{

#endif // !FEATURE_PAL
//
// сссссссуууукккккккккккккккккииииииииииииииии
//

for (int i = 0; i < sources.Length; i++)
{
string name = options.TempFiles.AddExtension(i + FileExtension);
Stream temp = new FileStream(name, FileMode.Create, FileAccess.Write, FileShare.Read);
try
{
using (StreamWriter sw = new StreamWriter(temp, Encoding.UTF8))
{
sw.Write(sources);
sw.Flush();
}
}
finally
{
temp.Close();
}
filenames = name;
}
results = FromFileBatch(options, filenames);
#if !FEATURE_PAL
}
finally
{
Executor.ReImpersonate(impersonation);
}
}
catch
{
throw;
}
#endif // !FEATURE_PAL

return results;
}



#14 
Murr патриот22.06.24 19:36
Murr
NEW 22.06.24 19:36 
in Antwort Murr 22.06.24 19:21

Нее, не пойдет...


Они дальше формируют полную командную строку со списком файлов и вызывают стандартный компилятор.. :(

#15 
Murr патриот22.06.24 20:11
Murr
NEW 22.06.24 20:11 
in Antwort AlexNek 22.06.24 17:25

и считаешь, что компайлер тоже без диска работает?

------

А вот это меня сейчас не интересует - если он что-то сбрасывает - плохо, но сейчас другая задача...

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

Надо еще Розелавн посмотреть


Это же сколько мусора нужно нагенерить для таких размеров?

------

Ну дали тебе десяток-другой баз по паре тысяч таблиц каждая - пиСай обвязку.

Ну или наоборот - пара тысяч юзеров и у каждого пустяковая базенка на десяток-другой таблиц

#16 
AlexNek патриот22.06.24 22:40
AlexNek
NEW 22.06.24 22:40 
in Antwort Murr 22.06.24 20:11
если он что-то сбрасывает

Так если он что то сбрасывает, то и решение 1й задачи не нужно. Или я что то не понимаю?

Помнишь, я пытался мышу генерить. Ну и на примерах всё работает, а с тем что нужно нет.


десяток-другой баз по паре тысяч таблиц каждая

любишь ты находить проблемные базы. По счастью еще ни разу не встречались подобные монстры. смущ

#17 
Murr патриот23.06.24 01:34
Murr
NEW 23.06.24 01:34 
in Antwort AlexNek 22.06.24 22:40

Или я что то не понимаю?

------

Я надеялся отдавать сгенерированный исходник сразу на вход компилятора.

Сам компилятор, если его строить строго по теории, штука небольшая и вполне себе встраиваемая.

Но! У мелкомягких инстанцирование компилятора не предусмотрено. Вообще.

Все что есть в .Нет - обвязка к вызову csc.exe.


А так - да, задача отпадает - генерируем, пересылаем, пишем и батничком запускаем csc...

#18 
AlexNek патриот23.06.24 11:45
AlexNek
NEW 23.06.24 11:45 
in Antwort Murr 23.06.24 01:34
Все что есть в .Нет - обвязка к вызову csc.exe.

Из кода нашел? Немного странно конечно.

Но исходники видимо где то есть можно вытащить начинку

#19 
Murr патриот23.06.24 12:19
Murr
NEW 23.06.24 12:19 
in Antwort AlexNek 23.06.24 11:45

Из кода нашел?

-----

угу... чутка одну из имплементаций пролистал.


Но исходники видимо где то есть можно вытащить начинку

-----

я сильно сомневаюсь что там .Нет реализация. обычно чистый Си.

#20 
1 2 alle