Rust: السماح بإنشاء رأس C يمثل رموز lib المصدرة

تم إنشاؤها على ١٧ نوفمبر ٢٠١٣  ·  11تعليقات  ·  مصدر: rust-lang/rust

فمثلا،

#[crate_type="lib"];

pub struct Foo { x: i16 }

#[no_mangle]
pub extern "C" fn bar(x: u64) -> Foo { ... }

pub fn ignored() { ... } // wrong ABI

سوف يتوافق مع

#ifndef FILENAME_H
#define FILENAME_H

#include<stdint.h>

struct Foo {
    int16_t x;
}

struct Foo bar(uint64_t);

#endif

بحيث يمكن للمرء الاتصال بـ Rust من C بسهولة أكبر.

(هذه هي العملية العكسية لوظيفة #[header="stdio.h"] mod stdio; المقترحة لاستخدام libclang لقراءة رؤوس C في نموذج يفهمه rustc: https://github.com/mozilla/rust/issues/2124)

A-ffi C-enhancement

التعليق الأكثر فائدة

أنا متأكد من أن الجميع هنا على دراية بالفعل ، ولكن يبدو أن أحدث ما توصلت إليه التقنية هنا هو جبنة شيدر صدئة: https://github.com/Sean1708/rusty-cheddar

ال 11 كومينتر

على نفس المنوال ، سمعت أن الحصول على rust.h سيكون من الجيد الحصول عليه لأشياء مثل:

typedef struct {
  void *data;
  uintptr_t len;
} RustSlice;

typedef struct {
  uintptr_t len;
  uintptr_t alloc;
  uint8_t data[0];
} RustString;

وغيرها من التعاريف المفيدة للمترجم.

يتمثل أحد الأجزاء الصعبة في هذا الأمر في تمثيل C لأنواع FFI ، وسيكون من الجيد حقًا التفاعل معهم من C ، لكن تحسيناتنا ستلغي المؤشرات والحجم التمييزي قد يجعلها صعبة.

: +1:

لقد بدأت إصدارًا من هذا على https://gist.github.com/alexcrichton/4ea33d9a8b19ed15a65a ، لكنها فقط البنية الأساسية المجردة للحصول على شيء مثل هذا وتشغيله.

alexcrichton هذا رائع جدا. قد ترغب في التمسك باستخدام أحرف الكتابة stdint.h لطباعة أنواع الأعداد الصحيحة ، نظرًا لأن العروض يمكن أن تختلف ويتم تحديد علامة char الموقعة.

/ سم مكعب لي

يقوم bindgen ببعض من هذا ، ولكن rust.h سيكون أمرًا رائعًا بالنسبة لـ FFIing في Rust بالتأكيد

تحرير: عفوًا ، اعتقدت أن bindgen قام بكلا الأمرين ، لكنه لم يفعل ذلك ، شكرًا huonw

(نوعًا من Offtopic: لم يكن Bindgen حتى صندوقًا مناسبًا من الصدأ ، في المرة الأخيرة التي تحققت فيها ، وكان بناءه على دبيان كافيًا لدرجة أنني اضطررت إلى اختيار مسار آخر لاحتياجات FFI الخاصة بي. الرغبة في الحصول على مثل bindgen أعتقد أن الوظيفة في Rust هي في الأساس رغبة في توفيرها في كل مكان. يمكن أن تكون راضية عن عمل bindgen كحزمة شحن مناسبة dev-dependencies قادرة على إنشاء بذرة الصدأ من رأس C بالكامل من build.rs ). يو بي إس. كان ذلك تشدق. :}

لدي بعض الأشياء قيد التقدم هنا. https://github.com/tomjakubowski/custard/tree/dev أعتقد أن آخر مرة تركتها ، ربما كانت في منتصف إعادة البناء.

يتبع نفس فكرة rustdoc: يمكنك السير في AST المكتوب ، وتصفية الأشياء التي تهتم بها الأداة ، وتنظيف الأنواع قليلاً ، وإصدار شيء ما (ملف رأس). بكل صدق ، قد يكون من المنطقي جعل هذا rustdoc "الواجهة الخلفية" أو شيء من هذا القبيل (إذا قمت بالتحديق ، فإن ملف الرأس هو مجرد نوع آخر من التوثيق).

أنا متأكد من أن الجميع هنا على دراية بالفعل ، ولكن يبدو أن أحدث ما توصلت إليه التقنية هنا هو جبنة شيدر صدئة: https://github.com/Sean1708/rusty-cheddar

الجبن الشيدر الصدئ والمجلد الصدئ ليسا نشطين للغاية في تلك الأيام. هل يجب أن تكون هذه ميزة مهمة بما يكفي للحفاظ على الصدأ بواسطة مشتل الصدأ أو ما شابه؟ تضمين التغريدة

إغلاق؛ يجب معالجة ذلك بواسطة أداة خارجية.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات