وقد استخدام C لتنفيذ اللغات الأخرى مقيدة تصاميمهم بأي شكل من الأشكال ؟

StackOverflow https://stackoverflow.com/questions/3513780

سؤال

ويبدو أن معظم جديد لغات البرمجة التي ظهرت في السنوات ال 20 الماضية قد كتب في C.هذا منطقي C يمكن أن ينظر إليه كنوع من المحمولة لغة التجميع.ولكن ما يثير فضولي هو ما إذا كان هذا قد مقيدة تصميم لغات بأي شكل من الأشكال.ما دفع سؤالي كان التفكير في كيفية C كومة يستخدم مباشرة في بيثون استدعاء وظائف.ومن الواضح أن لغة البرمجة مصمم يمكن أن تفعل ما تريد في أي لغة يريدون ، ولكن يبدو لي أن اللغة التي تختارها لكتابة اللغة الجديدة في يضعك في عقلية معينة و يعطيك بعض الاختصارات التي يصعب تجاهلها.هل هناك خصائص أخرى من هذه اللغات التي تأتي من كونها مكتوبة بهذه اللغة (جيدة أو سيئة)?

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

المحلول

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

ومع ذلك ، هناك بعض الحالات التي توجد فيها قيود. مثال على ذلك: يحتوي برنامج التحويل البرمجي لـ GHC Haskell على نص Perl يسمى مانجلر الشر لتغيير رمز التجميع الذي تم إغراقه في مجلس التعاون الخليجي لتنفيذ بعض التحسينات المهمة. لقد انتقلوا إلى التجميع الذي تم إنشاؤه داخليًا و LLVM جزئيًا لهذا السبب. ومع ذلك ، فإن هذا لم يقيد تصميم اللغة - فقط اختيار المترجم للتحسينات المتاحة.

نصائح أخرى

أنا أميل إلى الاختلاف.

لا أعتقد أنه يتم تنفيذ برنامج التحويل البرمجي أو المترجم الخاص باللغة في C - بعد كل شيء ، يمكنك تنفيذ جهاز افتراضي مع C يختلف تمامًا عن بيئته المضيفة ، مما يعني أنك يستطيع الابتعاد عن عقلية لغة C / بالقرب من التجميع.

ومع ذلك ، من الصعب الادعاء بأن لغة C بحد ذاتها لم يكن له أي تأثير على تصميم اللغات اللاحقة. خذ على سبيل المثال استخدام الأقواس المجعد { } لتجميع البيانات في كتل ، فإن فكرة أن المسافة البيضاء والمسافة البادئة غير مهمة في الغالب ، أسماء النوع الأصلي (int, char, ، وما إلى ذلك) والكلمات الرئيسية الأخرى ، أو الطريقة التي يتم بها تعريف المتغيرات (أي إعلان اكتب أولاً ، متبوعًا باسم المتغير ، التهيئة الاختيارية). تشارك العديد من اللغات الشهيرة والاستعراضية الشهيرة (C ++ ، Java ، C#، وأنا متأكد من وجود المزيد) هذه المفاهيم مع C. (ربما لم تكن جديدة تمامًا مع C ، لكن Afaik C توصلت إلى ذلك مزيج معين من بناء جملة اللغة.)

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

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

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

ج المكدس هو مجرد نظام المكدس, و هذا المفهوم يسبق ج قليلا جدا.إذا كنت دراسة نظرية الحوسبة سوف ترى أن استخدام كومة قوية جدا.

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

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

حيث بتنفيذ لغة C ربما تأثر اللغات الأخرى الأكثر وربما أشياء مثل كيف يهرب تتم في السلاسل ، والتي ربما أليس هذا الحد.

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

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

يختار العديد من المطورين C لعدة أسباب. أولاً ، C هي لغة شائعة جدًا. مشاريع مفتوحة المصدر على وجه الخصوص مثل أنه من الأسهل نسبيًا العثور على مطور من ذوي الخبرة من C أن يجد مطورًا مسرنًا معادًا في بعض اللغات الأخرى. ثانياً ، عادةً ما تفسح المجال أمام التحسين الجزئي. عند كتابة محلل من أجل لغة نصية ، يكون لكفاءة المحلل المحلل تأثير كبير على الأداء العام للنصوص المكتوبة بهذه اللغة. بالنسبة للغات المترجمة ، يمكن لمجمول البرمجي أكثر كفاءة أن يقلل من أوقات التجميع. العديد من المترجمين C جيدة جدًا في إنشاء رمز محسّن للغاية (وهو أيضًا جزء من السبب في برمجة العديد من الأنظمة المضمنة في C) ، ويمكن كتابة التعليمات البرمجية الحرجة في التجميع المضمّن. أيضا ، C موحدة وعموما هدف ثابت. يمكن كتابة التعليمات البرمجية إلى معيار ANSI/C89 ولا داعي للقلق بشأن كونه غير متوافق مع إصدار مستقبلي من C. المراجعات التي تم إجراؤها في وظائف إضافة C99 القياسية ولكن لا تكسر التعليمات البرمجية الحالية. أخيرًا ، C محمول للغاية. إذا كان هناك مترجم واحد على الأقل لمنصة معينة ، فمن المرجح أن يكون برنامج التحويل البرمجي C. إن استخدام لغة قابلة للتحويل عالية مثل C يجعل من السهل زيادة عدد المنصات التي يمكنها استخدام اللغة الجديدة.

القيد الوحيد الذي يتبادر إلى الذهن هو استضافة المترجم واستضافة التحويل البرمجي. النظر في حالة C#. يتم كتابة المترجم في C/C ++ وهو رمز أصلي بالكامل. هذا يجعله جداً من الصعب استخدامها في العملية مع تطبيق C#.

هذا له آثار واسعة لسلسلة الأدوات من C#. يجب أن يكون لأي رمز يريد الاستفادة من محلل C# الحقيقي أو محرك الربط مكونًا واحدًا على الأقل مكتوبًا في الكود الأصلي. يؤدي هذا في النهاية إلى معظم سلسلة الأدوات للغة C# التي يتم كتابتها في C ++ والتي تعتبر إلى الوراء قليلاً للغة.

هذا لا يحد من اللغة لكل قول ولكن بالتأكيد له تأثير على التجربة حول اللغة.

مجموعة القمامة. تطبيقات اللغة أعلى جافا أو .NET استخدم GC في VM. تلك الموجودة على قمة C تميل إلى استخدام العد المرجعي.

شيء واحد يمكنني التفكير فيه هو أن الوظائف ليست بالضرورة أعضاء من الدرجة الأولى في اللغة ، ولا يمكن إلقاء اللوم على ذلك على C وحده (أنا لا أتحدث عن تمرير مؤشر الوظيفة ، على الرغم من أنه يمكن القول أن C يوفر لك مع هذه الميزة).

إذا كان أحدهم يكتب DSL في Groovy (/scheme/lisp/haskell/lua/javaScript/وبعضها الآخر لست متأكدًا من) ، يمكن أن تصبح الوظائف أعضاء من الدرجة الأولى. يتيح جعل الوظائف أعضاء من الدرجة الأولى والسماح لوظائف مجهولة كتابة التعليمات البرمجية الموجزة والمزيد من القراءة البشرية (كما يتضح من LINQ).

نعم ، في النهاية يتم تشغيل كل هذه الأشياء تحت C (أو التجميع إذا كنت ترغب في الوصول إلى هذا المستوى) ، ولكن فيما يتعلق بتزويد المستخدم باللغة بالقدرة على التعبير عن أنفسهم بشكل أفضل ، تقوم هذه التجريدات بعمل رائع.

لا يحتوي تطبيق برنامج التحويل البرمجي/المترجم في C على أي قيود رئيسية. من ناحية أخرى ، فإن تنفيذ برنامج التحويل البرمجي من اللغة X إلى C. على سبيل المثال ، وفقا ل مقال ويكيبيديا عن ج- ، عند تجميع لغة ذات مستوى أعلى لـ C ، لا يمكنك القيام بجمع القمامة الدقيق ، أو معالجة استثناء فعالة ، أو تحسين عودة الذيل. هذا هو نوع المشكلة التي كان يهدف إلى حل.

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