2011-06-08 7 views
7

मैं अपने कुछ स्कैला कोड को सी पर पोर्ट करना चाहता हूं और इस पोर्ट किए गए कोड को अपने वर्तमान प्रोजेक्ट से कॉल करना चाहता हूं। लेकिन मुझे ऐसा करने के बारे में कोई दस्तावेज नहीं मिला। यह बहुत अच्छा होगा अगर यह एसबीटी से संभव होगा, क्योंकि यह मेरी वर्तमान निर्माण प्रणाली है।स्कैला सी एकीकरण

वर्तमान में मैं SNA के बारे में सुना है, लेकिन प्रलेखन

बिना मैं ग संकलक या ऐसा कुछ करने के लिए एक स्वचालित स्केला की तलाश नहीं कर रहा हूँ। मुझे नहीं पता कि स्कैला और सी

+4

तो आप स्कैला से सी या सी कोड से स्कैला कोड कॉल करना चाहते हैं? –

+0

जहां तक ​​मेरा संबंध है, मुझे लगता है कि मैंने आपके प्रश्न का उत्तर दिया है। दो अन्य लोगों ने भी किया, लेकिन आपने इनमें से किसी को जवाब देने के लिए चिह्नित नहीं किया। वह अजीब है। – Madoc

उत्तर

13

स्कैला और सी मौलिक रूप से विभिन्न प्रोग्रामिंग भाषाएं हैं। आप स्कैला से सी

से स्वचालित कनवर्टर होने की उम्मीद नहीं कर सकते हैं यदि आप सी कोड या इसके विपरीत से स्कैला कोड कॉल करना चाहते हैं, तो आपको Java Native Interface (JNI) का उपयोग करना चाहिए। इस मामले में, आपके पास अपने स्कैला कोड को निष्पादित करने वाला एक चल रहा JVM होगा, और JVM आपके सी कोड को गतिशील देशी लाइब्रेरी के रूप में लोड करेगा और इसे आपके जावा/स्कैला कोड के साथ जेएनआई के माध्यम से बातचीत करने की अनुमति देगा। हालांकि यह आसान या सीधा नहीं है; आपको बहुत कुछ पढ़ना और कोशिश करना है।

1

तक जहां तक ​​मुझे पता है कि इस समय में सी को स्कैला कोड निर्यात करने का कोई तरीका नहीं है, लेकिन आप इसे स्वयं लिखने के लिए स्वतंत्र हैं;)

+0

देशी कोड में बाइटकोड संकलित करना संभव हो सकता है। – ziggystar

+0

मुझे पता है कि एलएलवीएम पर स्कैला चलाने के लिए एक परियोजना है। यह भविष्य के लिए एक सकारात्मकता हो सकता है ... – Fabian

17

मुझे संदेह है कि आपको सी कोड संकलित करने के लिए एक एसबीटी-केवल समाधान मिलेगा। यहां तक ​​कि यदि आपको एक एसबीटी प्लगइन मिला है जो सी कोड संकलित करता है, तो भी यह वास्तव में हैरान होगा अगर यह ठीक से हुआ। स्केल संकलन की तुलना में मूल पुस्तकालयों को संकलित करना बहुत अलग है।

अपनी सी या सी ++ लाइब्रेरी को संकलित करने के लिए, मैं CMake या Automake की अनुशंसा करता हूं। न तो सही है, लेकिन दोनों मूल रूप से घोषित करने की अनुमति देने का एक अच्छा काम करते हैं "इन .c या .cpp फ़ाइलों को एक .so में संकलित करें"। ओपन सोर्स प्रोजेक्ट्स के साथ ऑटोमैक अधिक लोकप्रिय है, लेकिन सीएमके काफी सरल है। विंडोज़ पर संकलन के लिए सीएमके के पास भी अच्छा समर्थन है, अगर यह एक आवश्यकता है।

स्कैला से अपनी मूल लाइब्रेरी तक पहुंचने के लिए, मैं JNA का उपयोग करने की सलाह देता हूं। यह आपको स्कैला समेत किसी भी जेवीएम भाषा से मूल कोड तक पहुंचने की अनुमति देता है। और यह JNI द्वारा आवश्यक गोंद परत या कोड जनरेशन के बिना ऐसा करता है।

मैंने जावा से स्कैला तक the JNA example पोर्ट किया है। ध्यान देने के लिए कुछ चीजें हैं।

  1. जावा varargs स्कैला varargs से अलग हैं। यदि आप एक वैरिएडिक सी फ़ंक्शन को कॉल करना चाहते हैं, तो आपको स्कैला के बजाय जावा में इंटरफ़ेस लिखना होगा। लेकिन आप उस इंटरफेस का उपयोग उसी तरह करेंगे जैसे आप स्केल में लिखे गए थे।
    • मैं उदाहरण चाहता था स्काला में सख्ती से रहने के लिए, तो मैं उदाहरण
  2. मैं काफी एक सीधे बंदरगाह किया में puts बजाय printf इस्तेमाल किया। आप स्काला-एस्क्यू के लिए चीजों को थोड़ा सा बनाना चाहते हैं।

और कोड:

import com.sun.jna.{Library, Native, Platform} 

trait CLibrary extends Library { 
    def puts(s: String) 
} 

object CLibrary { 
    def Instance = Native.loadLibrary(
    if (Platform.isWindows) "msvcrt" else "c", 
    classOf[CLibrary]).asInstanceOf[CLibrary] 
} 

object HelloWorld { 
    def main(args: Array[String]) { 
    CLibrary.Instance.puts("Hello, World"); 
    for ((arg, i) <- args.zipWithIndex) { 
     CLibrary.Instance.puts(
     "Argument %d: %s".format(i.asInstanceOf[AnyRef], arg)) 
    } 
    } 
} 

एक के रूप में अलग रूप में, यह है कि आप विशेष रूप से सी संकलक करने के लिए एक स्काला नहीं चाहते उल्लेख मज़ेदार है। स्केल से एलएमवीएम को संकलित करने के बारे में प्रकाशित recent paper था, जो स्केल टू सी कंपाइलर के रूप में काफी हद तक प्रभावशाली होगा।

संबंधित मुद्दे