Hallo,
Die Hauptfrage ist, wie würdet ihr das angehen?
Was ist mein Ziel?
Mein Ziel ist es eine neue Programmiersprache bzw. angepasstes CSharp für mehr Low-Level access und features zu "schreiben".
Was stört mich momentan an CSharp?
Spoiler anzeigen
Was ich damit sagen will: Immer wird gesagt, man kann kein OS in CSharp schreiben (Was schon probiert wurde und auch ziemlich gut klappte, soweit ich weiß) und das find ich eig traurig,
denn ich find CSharp eine wunderschöne sprache, denn sie liest sich (für mich) wie ein Buch und ich find auch den Style sehr schön in CSharp.
Kurz um drum: Mir fehlen Feature ... und die Code-Gen Ka*** macht es nicht besser. Ist schön aber jedes mal Visual Studio neustarten nach einer änderung macht kein Spaß
PS: ReSharper ist da nicht besser.
So wie würdet ihr das angehen?
- Eigenen parser mit lexer, gramma und was da nicht dazu gehört (nicht compiler, der muss eh neu geschrieben werden)
- Den kram von Roslyn nutzen, der sehr aufwending geschreiben ist und erst studiert werden muss?
- Microsoft.CodeAnalysis.CSharp- Nuget nutzen, damit ich mir lexing und parsing spare und "nur noch" die nodes analysieren muss?
- oder ganz anders?
MfG
Facebamm
Die Hauptfrage ist, wie würdet ihr das angehen?
Was ist mein Ziel?
Mein Ziel ist es eine neue Programmiersprache bzw. angepasstes CSharp für mehr Low-Level access und features zu "schreiben".
Was stört mich momentan an CSharp?
naja, mittlerweile arbeite ich viel mit CSharp auf geräten mit den ich gern viel mehr machen würdem zum Beispiel mit einem Raspberry Pi 4 (Hier raus entstand auch alles).
... Mir feht da einfach das low level .. in manchen fällen wurde ich gern assembler ausführen, was in CSharp seh schwer ist umzusetzen.
Hier mal wie sowas aussehen könnte(windows)
Spoiler anzeigen
- oder einfach paar nop's als timing ist recht "aufwending"
Spoiler anzeigen
- oder warum muss ich bei einer IF-Abfrage immer ein bool haben, warum nicht 0 := 0 und >0 := 1?
Hier beim auslesen vom status im speicher
Warum die abfrage ob das identisch ist um einen bool zu erhalten?
- oder warum kann ich kein datentyp gaben der ab den 3 Bit schreibt, sonder nur in byte steps [FiedOffset(byteoffset)].
- dann fehlen mir die macros
Spoiler anzeigen
Dann stört es mich, das ich keine Context freien Methoden schreiben kann.
Also ich brauch immer eine Klasse.
Ich weiß ich kann using static xyz; nutzen, aber das ist doch nicht sinn der sache.
Ich weiß das es für VS ein plugin gibt mit dem direkt il geschrieben werden kann, aber selbst das ist nicht so schön. (Mein empfinden)
... Mir feht da einfach das low level .. in manchen fällen wurde ich gern assembler ausführen, was in CSharp seh schwer ist umzusetzen.
Hier mal wie sowas aussehen könnte(windows)
C#-Quellcode
- static class PFunction
- {
- public static void* LoadMemoryFunction(byte[] funcSrc)
- {
- int srcLen = (funcSrc.Length * sizeof(byte));
- byte* pFunc = (byte*) Marshal.AllocHGlobal(srcLen); // wurde ich jetzt auch nicht mehr so machen
- Buffer.MemoryCopy(Unsafe.AsPointer(ref funcSrc[0]), pFunc, srcLen , srcLen);
- VirtualProtectEx(Process.GetCurrentProcess().Handle, pFunc, (UIntPtr)srcLen, 0x40, out _);
- return pFunc;
- }
- [DllImport("kernel32.dll")]
- static extern bool VirtualProtectEx(IntPtr hProcess,
- void* lpAddress,
- UIntPtr dwSize,
- uint flNewProtect,
- out uint lpflOldProtect);
- }
- // weiß nicht mal mehr ob das noch geht
- private static readonly byte[] asmCode =
- {
- 0x89, 0xD0, 0x44, 0x29, 0xC0,
- 0x89, 0xC1, 0xC1, 0xF9, 0x1F, 0x21,
- 0xC1, 0x89, 0xD0, 0x29, 0xC8, 0xC3
- };
- private byte* asmCodeBuffer;
- private delegate* <int, int, int> MinMaxASM;
- private delegate* <int, int, int> MinMax;
- public void Init()
- {
- MinMaxASM = (delegate* <int, int, int>) PFunction.LoadMemoryFunction(asmCode);
- MinMax = &MinMax2;
- }
- oder einfach paar nop's als timing ist recht "aufwending"
C#-Quellcode
- public delegate void TimerInvoker();
- public static TimerInvoker CreateNopTimer(int cycleCount)
- {
- DynamicMethod delayN = new DynamicMethod(
- $"Delay{cycleCount}",
- null,
- null,
- typeof(Timer).Module);
- ILGenerator il = delayN.GetILGenerator();
- for (int i = 0; i < cycleCount; i++)
- {
- il.Emit(OpCodes.Nop);
- }
- il.Emit(OpCodes.Ret);
- return (TimerInvoker)delayN.CreateDelegate(typeof(TimerInvoker));
- }
- oder warum muss ich bei einer IF-Abfrage immer ein bool haben, warum nicht 0 := 0 und >0 := 1?
Hier beim auslesen vom status im speicher
Warum die abfrage ob das identisch ist um einen bool zu erhalten?
- oder warum kann ich kein datentyp gaben der ab den 3 Bit schreibt, sonder nur in byte steps [FiedOffset(byteoffset)].
- dann fehlen mir die macros
C#-Quellcode
- // quellcode ist noch beim übersetzen von Cpp to CSharp, also nicht wundern wegen dem sizeof(struct v4l2_streamparm)
- /// <summary>_IOWR('V', 15, struct v4l2_buffer)</summary>
- public const uint VIDIOC_QBUF = (_IOWR << (int) _IOC_DIRSHIFT)
- | ((uint) 'V' << (int) _IOC_TYPESHIFT)
- | (15U << (int) _IOC_NRSHIFT)
- | ((uint) sizeof(struct v4l2_buffer) << (int) _IOC_SIZESHIFT);
- /// <summary>_IOWR('V', 17, struct v4l2_buffer)</summary>
- public const uint VIDIOC_DQBUF = (_IOWR << (int) _IOC_DIRSHIFT)
- | ((uint) 'V' << (int) _IOC_TYPESHIFT)
- | (17U << (int) _IOC_NRSHIFT)
- | ((uint) sizeof(struct v4l2_buffer) << (int) _IOC_SIZESHIFT);
- /// <summary>_IOW('V', 18, int)</summary>
- public const uint VIDIOC_STREAMON = (_IOW << (int) _IOC_DIRSHIFT)
- | ((uint) 'V' << (int) _IOC_TYPESHIFT)
- | (18U << (int) _IOC_NRSHIFT)
- | ((uint) sizeof(int) << (int) _IOC_SIZESHIFT);
- /// <summary>_IOW('V', 19, int)</summary>
- public const uint VIDIOC_STREAMOFF = (_IOW << (int) _IOC_DIRSHIFT)
- | ((uint) 'V' << (int) _IOC_TYPESHIFT)
- | (19U << (int) _IOC_NRSHIFT)
- | ((uint) sizeof(int) << (int) _IOC_SIZESHIFT);
- /// <summary>_IOWR('V', 21, struct v4l2_streamparm)</summary>
- public const uint VIDIOC_G_PARM = (_IOWR << (int) _IOC_DIRSHIFT)
- | ((uint) 'V' << (int) _IOC_TYPESHIFT)
- | (21U << (int) _IOC_NRSHIFT)
- | ((uint) sizeof(struct v4l2_streamparm) << (int) _IOC_SIZESHIFT);
- /// <summary>_IOWR('V', 22, struct v4l2_streamparm)</summary>
- public const uint VIDIOC_S_PARM = (_IOWR << (int) _IOC_DIRSHIFT)
- | ((uint) 'V' << (int) _IOC_TYPESHIFT)
- | (22U << (int) _IOC_NRSHIFT)
- | ((uint) sizeof(struct v4l2_streamparm) << (int) _IOC_SIZESHIFT);
- /// <summary>_IOR('V', 23, v4l2_std_id)</summary>
- public const uint VIDIOC_G_STD = (_IOR << (int) _IOC_DIRSHIFT)
- | ((uint) 'V' << (int) _IOC_TYPESHIFT)
- | (23U << (int) _IOC_NRSHIFT)
- | ((uint) sizeof(v4l2_std_id) << (int) _IOC_SIZESHIFT);
- /// <summary>_IOW('V', 24, v4l2_std_id)</summary>
- public const uint VIDIOC_S_STD = (_IOW << (int) _IOC_DIRSHIFT)
- | ((uint) 'V' << (int) _IOC_TYPESHIFT)
- | (24U << (int) _IOC_NRSHIFT)
- | ((uint) sizeof(v4l2_std_id) << (int) _IOC_SIZESHIFT);
Dann stört es mich, das ich keine Context freien Methoden schreiben kann.
Also ich brauch immer eine Klasse.
Ich weiß ich kann using static xyz; nutzen, aber das ist doch nicht sinn der sache.
Ich weiß das es für VS ein plugin gibt mit dem direkt il geschrieben werden kann, aber selbst das ist nicht so schön. (Mein empfinden)
Was ich damit sagen will: Immer wird gesagt, man kann kein OS in CSharp schreiben (Was schon probiert wurde und auch ziemlich gut klappte, soweit ich weiß) und das find ich eig traurig,
denn ich find CSharp eine wunderschöne sprache, denn sie liest sich (für mich) wie ein Buch und ich find auch den Style sehr schön in CSharp.
Kurz um drum: Mir fehlen Feature ... und die Code-Gen Ka*** macht es nicht besser. Ist schön aber jedes mal Visual Studio neustarten nach einer änderung macht kein Spaß
PS: ReSharper ist da nicht besser.
So wie würdet ihr das angehen?
- Eigenen parser mit lexer, gramma und was da nicht dazu gehört (nicht compiler, der muss eh neu geschrieben werden)
- Den kram von Roslyn nutzen, der sehr aufwending geschreiben ist und erst studiert werden muss?
- Microsoft.CodeAnalysis.CSharp- Nuget nutzen, damit ich mir lexing und parsing spare und "nur noch" die nodes analysieren muss?
- oder ganz anders?
MfG
Facebamm