هذا هو منفذ نص VIM من 8cc مبني على ELVM. بمعنى آخر ، هذا هو برنامج التحويل البرمجي C كامل مكتوب في نص VIM.
8CC هو برنامج التحويل البرمجي C صغير مكتوب بشكل جيد لـ X86_64 Linux. إنه مدرك C11 ومستضيفه.
elvm هو e e l ang v irtual m achine. ELVM Retargets 8cc لإبعاد تمثيلها الوسيط ، EIR. يقوم ELVM بتجميع كود C في EIR مع 8cc المعاد استهداف كواجهة أمامية. ثم يترجم EIR إلى أهداف مختلفة (Python ، Ruby ، C ، Brainfxxk ، Piet ، Befunge ، Emacs lisp ، ...) في الخلفية. العمارة تشبه LLVM. هذا العرض هو أشياء جيدة لمعرفة العمارة ELVM بشكل أكبر (وإن كان في اليابانية).
يمكن لـ ELVM تجميع نفسها في أهداف مختلفة. لذلك أضفت الواجهة الخلفية الجديدة "VIM Script" واستخدمها لترجمة رمز C 8cc إلى نص VIM.
الآن 8cc.vim مكتوبة في نص VIM النقي. 8CC.VIM يتكون من الواجهة الأمامية (مخصصة 8cc) والخلفية (ELC). يمكنه تجميع كود C في البرنامج النصي VIM. وبالطبع يمكن لـ VIM تقييم رمز البرنامج النصي الذي تم إنشاؤه.
لاحظ أن هذا مشروع لعبة. 8CC.VIM أبطأ بكثير. يستغرق 824 (الواجهة الأمامية: 430 + الخلفية: 396) ثواني لتجميع أبسط برنامج putchar() على MacBook Pro في أوائل 2015 (2.7 جيجاهرتز Intel Core I5). ولكن في الواقع يعمل!
أثناء تشغيل VM على برنامج VIM Script ، يعمل 8cc.vim على Windows Linux و OS X و (نأمل).
يرجى استنساخ هذا المستودع و :packadd (يرجى الاطلاع على :help pack-add ).
أو يرجى استخدام مدير البرنامج المساعد المفضل لديك (Vim-Plug و Dein.vim وما إلى ذلك).
:EccCompile:EccRuneightcc#compile()eightcc#run()قم بإعداد رمز C في المخزن المؤقت الحالي. فيما يلي مثال "Hello World".
int putchar ( int x );
int main () {
const char * p = "Hello, world!n" ;
for (; * p ; p ++ )
putchar ( * p );
return 0 ;
} ثم تنفيذ :EccCompile . لاحظ أنه يمكنك استخدام العديد من الخيارات مثل --verbose لهذا الغرض. يرجى الاطلاع على :EccCompile --help لمزيد من التفاصيل.
يستغرق فترة طويلة 20 دقيقة أو أكثر. لنأخذ قسطًا من الراحة ونحصل على بعض ☕.
ونتيجة لذلك ، يتم فتح المخزن المؤقت الجديد باستخدام رمز البرنامج النصي VIM الذي تم تجميعه من رمز C. قم بتحميله بواسطة :w putchar.vim و :source putchar.vim .
أخيرًا ، قم بتنفيذ رمز نص VIM أدناه بيدك. يتم تشغيل الرمز المترجم على VM على نص VIM. تنشئ دالة SetupVM() مثيل VM.
:let vm = SetupVM()
:call vm.run()
إذا كنت ترغب في رؤية نتيجة تشغيل البرنامج النصي VIM فقط ، فيمكنك استخدام :EccRun لتخطي العملية أعلاه.
المقابلة لـ :EccCompile و :EccRun ، يمكنك استخدام وظائف eightcc#compile() و eightcc#run() . يمكنهم أخذ قاموس واحد لخيارات التنفيذ.
رخصة معهد ماساتشوستس للتكنولوجيا
حقوق الطبع والنشر (C) 2016 Rhysd
يتم منح الإذن بموجب هذا ، مجانًا ، لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج") ، للتعامل في البرنامج دون تقييد ، بما في ذلك على سبيل المثال لا الحصر حقوق استخدام الأشخاص ونسخها ودمجها ودمجها وتوزيعها وتوزيعها على ما يلي:
يجب إدراج إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو" ، دون أي ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق واللياقة لغرض معين وعدم الانفجار. لا يجوز بأي حال من الأحوال أن يكون المؤلفون أو حاملي حقوق الطبع والنشر مسؤولاً عن أي مطالبة أو أضرار أو مسؤولية أخرى ، سواء في إجراء عقد أو ضرر أو غير ذلك ، ناشئة عن أو خارج البرنامج أو الاستخدام أو غيرها من المعاملات في البرنامج.