LINUX.ORG.RU

История изменений

Исправление 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 . ;