سؤال

هل هناك أداة متوفرة والتي ستحويل التعليمات البرمجية المصدرية في بيرل إلى التعليمات البرمجية المصدر في C؟ أي منصة جيدة.

هل كانت مفيدة؟

المحلول

هنالك perlcc. الذي "يترجم" بيرل إلى C.

انها ليست حقا perl to c compiler؛ إن إخراجه هو ببساطة حزمة من مترجم بيرل و PAYTECODE المحلي من البرنامج الخاص بك.

نصائح أخرى

الجواب الكنسي لهذا هو MJD "لماذا لا ترجم بيرل إلى ج؟".

الجواب سيكون كثيرا "لا". بيرل هي لغة ديناميكية للغاية. C هي لغة لأنواع البيانات ذات الحجم الكبير. من المرجح أن تكون أي ترجمة لل perl إلى C "تنفيذ دعوة الروتين الفرعية لمحاكاة ما يفعله بيرل" مرارا وتكرارا. وهناك القليل من النقاط في بناء مثل هذا المترجم، لأنه من غير المرجح أن تنفذ بيرل أسرع بكثير من بيرل.

كتبت برنامجا كبيرا كبيرا في بيرل الذي يقوم بإنشاء PDF بناء على استعلامات HTML وقواعد البيانات التي تعمل تقريبا مثل المستعرض. إجمالي حجم شفرة المصدر هو أكثر من 1 ميغابايت. تقوم البرامج بتقييم HTML، وإنشاء استعلامات SQL واسترجاع البيانات، ويبحث عن الصور على القرص أو تنزيلها من خوادم HTTP، وبناء بنية مستند، يقوم بجميع حسابات التصميم، وأخيرا، تنتج PDF.

اضطررت إلى معرفة كيفية تسريع العملية بعدة طرق. بناء على ذلك، أذكر أن بيرل سريع للغاية، والعديد من المهام المكتملة بسرعة ونجاح في بيرل يستغرق وقتا طويلا في C، وحتى C ++.

هناك طريقتان لجعل بيرل بطيء أو تستهلك الذاكرة: عدد كبير من هياكل البيانات المعقدة - يحتاجون إلى الكثير من الذاكرة - وعدد كبير من الحسابات. نعم، حساب هو في الواقع بطيء جدا في بيرل. مصطلح بسيط مثل

$a = $b * $c

مستهلك طويل للغاية في بيرل، ولكن سريع جدا في أي لغة تجميعية. قد تكون المعاملات هنا أعداد صحيحة، وليس متغيرات النقطة العائمة - إنها بطيئة. أعتقد أن هذا هو السبب وراء قيام بيرل بدرجات سيئة للغاية في مسابقة تبادل لاطلاق النار اللغة [http://shootout.alioth.debian.org/ القطر الساحاني (لعبة معايير لغة الكمبيوتر).

لقد وجدت برنامجي كبير جدا - يستخدم العديد من وحدات Perl Core و CPAN الإضافية أيضا - للبدء بسرعة، على الرغم من كونها Intepreted.

إنه ينفذ جيدا ... حتى يتعلق الأمر بحساب أحجام النصوص وإحداثيات التخطيط. هذا للغاية يستهلك الوقت. بعد القول هذا، كتبت برامج اختبار بيرل الصغيرة فقط القيام بملايين الحسابات الحسابية ووجدتهم أن تكون بطيئة للغاية.

إلى جانب ذلك، أنا أستخدم ونهج كائن موجه نحو نموذج كل عنصر تخطيط. يتم تمثيل كل كائن من خلال التجزئة - هذا على الأقل حوالي 10kbytes لكل كائن. إذا كان هناك كمية كبيرة من البيانات للطباعة، فإن استهلاك الذاكرة لعدة 100 ميغابايت ليس غير عادي لهذا البرنامج.

لذلك، لا يزال لدي سبب وجيه لتحريك الجزء الذي يحسب التخطيط إلى C، باستخدام الهياكل التي لديها الآن الآن اجعلها الآن مع المفاتيح الثابتة والحصول على حساب عدد صحيح C الذي يقوم به الآن وظيفة بطيئة.

لكن كل شيء آخر تم القيام به واختباره بسرعة ويتم تشغيله بسرعة لا أرى أي سبب للتغيير. أنا أيضا أجد رمز بيرل أكثر ملاءمة لكتابة واختبار من رمز C. والكثير من وحدات CPAN توفر الحلول التي لا يجب عليك العمل بها بنفسك. كثير منهم يتم اختبارها جيدا وتوثيقها.

بعد هذا dicussion tenghty، أختتم: إذا كان من المفترض أن يكون برنامج خادم أو سطر الأوامر، فكر في بيرل. ولكن إذا كان لهذا البرنامج بناء هياكل بيانات ضخمة أو الكثير من الحسابات، فكر في شيء أسرع. في بعض الأحيان، قد يكون برنامج بيرل مع وحدة نمطية مكتوبة في C.

هناك بيرل للمترجمين، ولكن لا شيء مثالي. من الناحية المثالية أنك تريد أن يكون مترجم صحيح وأنيق. للأسف، لا يمكن أن يكون لديك كلا من كود بيرل بسيطة لا يعادل رمز C بسيط، بحيث يكون لديك إما أن يكون لديك ترجمة صحيحة 100٪ أو معقدة مثل Perl نفسها. وقد أدى ذلك إلى أن البعض يعتقد أنك لا يجب أن تحاول ترجمة بيرل. سيكون أكثر دقة أن نقول أنك بحاجة إلى أن تكون واضحة عما تريد تحقيقه من الترجمة، ولا تتوقع المعجزات.

100٪ صحيح سهل: إذا كان البرنامج النصي بيرل الخاص بك myperl.pl ثم برنامج C void main(){system("perl myperl.pl")} سوف تفعل بالضبط ما سوف myperl.pl ستفعل؛ هذا غير مدفوع إلى حد ما. ال perlcc مترجم أكثر تطورا قليلا، لكن لا يزال لا يبدو أنه يعطي الكثير من الفائدة. أنا لم ألاحظ perlcc أن تكون أسرع من perl العادي. أيضا، في حين أن رمز بيرل يمكن أن يكون من الصعب قراءته، أفضل print "Hello World\n" إلى 700 خط الوحش الطويل perlcc يترجم ذلك إلى. أنا لم أر هذه البرامج تنتج أي شيء من شأنه أن يمر استعراض رمز وكذلك كود C الأنيق المكتوب. Otoh، إذا كنت تريد مترجما لأنك لا ترغب في توزيع التعليمات البرمجية المصدر بطريقة غير طبيعية، إذن perlcc يمكن أن تعمل العجائب.

rperl. يمكن تحقيق سرعة UPS، ولكن محدود للغاية في ما يمكن أن يترجم.

للحصول على مثال مترجم "أنيق غير صحيح" تافهة، راجع النموذج الأولي PERL2C ++. pl. وبعد يعمل هذا عن طريق استبدال (عدد قليل) ISMS القياسية مع C ++ - ISMS. تم اختيار C ++ لأنها لغة رفيعة المستوى مثل بيرل، ولكن لا تزال تشترك في نفس روح المعادن العارية في C.

في حالة مولد رقم عشوائي LCG LCG بسيط lcg.pl., ، انتاج perl2c++.pl نظيف ومخلص C ++ رمز يدير العشرات بشكل أسرع من بيرل الأصلي ولا يعتمد على أي مكتبات بيرل. يمكن تمديده للبحث عن جميع الإجابات القياسية على "كيفية القيام X على Perl"، واستبداله ب "كيفية القيام X في C ++". ثم قد يقوم بنجاح بترجمة العديد من البرامج النصية البسيطة ولكنها حقيقية في العالم، ومساعدة برامج بيرل غير تافهة للإنسان في كود C ++ الأنيق. سيكون هذا مفيدا للغاية إذا وجدت نفسك كتابة برامج رقمية في بيرل التي يجب أن تكون مكتوبة في C ++ في المقام الأول.

بالنسبة للبرمجيات التي مناسبة تماما، ولكنك تريد فقط أن تذهب أسرع قليلا، فإن نهج JIT المستخدمة من قبل JavaScript (وفي نهاية المطاف بيرل 6) هو أكثر واعدة.

يسمى المحول مبرمج, ، وعملية التحويل برمجة. وبعد على محمل الجد، فإن اللغة السليمة للبيرل شاسعة للغاية وقوية، وأن أي شخص يحاول كتابة محول سينظر إلى مهمة طويلة في الحياة. بالإضافة إلى ذلك، قد لا يكون التأثير في تحسين الأداء أمرا بالحجم، فلماذا تهتم؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top