История изменений
Исправление MOPKOBKA, (текущая версия) :
Как вообще реализовано в разных Фортах подключение функций из libc? Что-такое видел, но показалось что стандарта на это нет? Или есть?
Стандартные слова, и то что они делают можно удобно посмотреть тут https://forth-standard.org/standard/words
Стандарта нету, каждый дает свое, примеры:
https://vfxforth.com/flag/extern/externVFX.html
https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Declaring-C-Function...
Это подключение функций из любых динамических библиотек. Что бы вызывать функции C библиотек, твоя программа должна запускаться через main() и быть слинкована с libc, иначе все поломается, перед main() происходит инициализация, а после нее libc передает управление твоей программе.
А сам вызов функций из .so можно делать как обычно, через https://man7.org/linux/man-pages/man3/dlopen.3.html
Только сначала нужно почитать про ABI, https://wiki.osdev.org/System_V_ABI первый аргумент это регистр rdi, второй rsi и так далее.
Я функции на С не вызываю, у меня есть только слово SYSCALL, оно принимает номер системного вызова, и количество аргументов, при его вызове оно удаляет 2 этих значений со стека, плюс указанное количество аргументов, и помещает их по регистрам, и делает SYSCALL. Так у меня обернуты различные вызовы:
...
: ioctl 3 16 syscall ;
: nanosleep 2 35 syscall ;
: pool 3 7 syscall ;
...
Как ввести зарезервированное слово, не меняя синтаксис?
Что то вопрос не понял, но ты вроде про inline спрашиваешь? У меня inline пишется после определения слова, и меняет его атрибуты в словаре, точно так же как и IMMEDIATE, у меня несколько разных возможных атрибутов на слова есть.
: ^2 dup * ; inline
И теперь всегда ^2 будет инлайнится. Если тебе нужно инлайнить слово лишь в некоторых ситуациях, то можно сделать слово [inlinе], и использовать так:
: some-word 5 [inlinе] ^2 . ;
Исходная версия MOPKOBKA, :
Как вообще реализовано в разных Фортах подключение функций из libc? Что-такое видел, но показалось что стандарта на это нет? Или есть?
Стандартные слова, и то что они делают можно удобно посмотреть тут https://forth-standard.org/standard/words
Стандарта нету, каждый дает свое, примеры:
https://vfxforth.com/flag/extern/externVFX.html
https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Declaring-C-Function...
Это подключение функций из любых динамических библиотек. Что бы вызывать функции C библиотек, твоя программа должна запускаться через main() и быть слинкована с libc, иначе все поломается, перед main() происходит инициализация, а после нее libc передает управление твоей программе.
А сам вызов функций из .so можно делать как обычно, через https://man7.org/linux/man-pages/man3/dlopen.3.html
Только сначала нужно почитать про ABI, https://wiki.osdev.org/System_V_ABI первый аргумент это регистр rdi, второй rsi и так далее.
Я функции на С не вызываю, у меня есть только слово SYSCALL, оно принимает номер системного вызова, и количество аргументов, при его вызове оно удаляет 2 этих значений со стека, плюс указанное количество аргументов, и помещает их по регистрам, и делает SYSCALL. Так у меня обернуты различные вызовы:
...
: ioctl 3 16 syscall ;
: nanosleep 2 35 syscall ;
: pool 3 7 syscall ;
...
Как ввести зарезервированное слово, не меняя синтаксис?
Что то вопрос не понял, но ты вроде про inline спрашиваешь? У меня inline пишется после слова, и меняет его атрибуты, точно так же как и IMMEDIATE, у меня несколько разных возможных атрибутов на слова есть.
: ^2 dup * ; inline
И всегда ^2 будет инлайнится. Если тебе нужно инлайнить слово лишь в некоторых ситуациях, то можно сделать слово [inlinе], и использовать так:
: some-word 5 [inlinе] ^2 . ;