क्या PHP संकलित या व्याख्या की गई है?


142

क्या PHP संकलित या व्याख्या की गई है?

जवाबों:


127

PHP एक व्याख्या की गई भाषा है। बाइनरी जो आपको PHP की व्याख्या करने देता है, संकलित है, लेकिन आप जो लिखते हैं उसकी व्याख्या की जाती है।

आप व्याख्या की गई भाषाओं के लिए विकिपीडिया पृष्ठ पर अधिक देख सकते हैं


26
उसका मतलब है कि php (या विंडोज़ पर php.exe) नामक उपयोगिता संकलित है।
sepp2k

7
@nicky इसका अर्थ है कि PHP की व्याख्या करने के लिए उपयोग किए जाने वाले प्रोग्राम को संकलित किया गया है, लेकिन PHP की ही व्याख्या की जाती है।
एंड्रयू सॉन्ग

5
लेकिन इसका उल्लेख विकिपीडिया में ऐसा क्यों है? goo.gl/YOwZ PHP 4 के बाद से, PHP पार्सर अपने इंटरप्रेटर पूर्ववर्ती पर बेहतर प्रदर्शन देते हुए, Zend इंजन द्वारा प्रसंस्करण के लिए बायटेकोड का उत्पादन करने के लिए इनपुट संकलित करता है।
किरनवज

5
@kiranvj यह वास्तव में बेहतर प्रदर्शन के लिए संकलित है, लेकिन रनटाइम पर। "संकलित भाषाओं" को "पूर्व-संकलित" के रूप में सोचें, और व्याख्या की गई भाषाओं को "जब संकलित किया जाए"। यह इन दोनों के बीच का अंतर है: - JIT ("बस समय में"), जहां केवल आवश्यक कोड की आवश्यकता होने पर संकलित किया जाता है (ध्यान दें, हालांकि, दुभाषिया क्विट के बाद, संकलित कोड बहुत है) - AOT (" समय से आगे)), जहां सभी कोड को चलाने से पहले संकलित किया जाता है।
थिबॉल्ट मार्टिन-लैगार्डेट

4
@kiranvj: मेरा मानना ​​है कि ओपी जानना चाहता है कि क्या PHP मूल कोड के लिए संकलित है। इसे बायटेकोड पर संकलित करना, जो फिर Zend द्वारा व्याख्या की जाती है, संकलन लागत और रनटाइम प्रदर्शन के मामले में कहीं बीच में है। लोल, यह एक पुराना धागा है, बस इसे महसूस किया है।
ग्रू

66

दोनों। PHP को एक मध्यवर्ती बाईटेकोड के रूप में संकलित किया जाता है, जिसे तब रनटाइम इंजन द्वारा व्याख्या किया जाता है।

PHP संकलक का काम अपने PHP कोड को पार्स करना है और इसे रनटाइम इंजन के लिए उपयुक्त रूप में परिवर्तित करना है। इसके कार्यों के बीच:

  • टिप्पणियों पर ध्यान न दें
  • चर, फ़ंक्शन नाम, और इसके बाद हल करें और प्रतीक तालिका बनाएं
  • अपने प्रोग्राम के अमूर्त सिंटैक्स ट्री का निर्माण करें
  • बाईटकोड लिखिए

आपके PHP सेटअप के आधार पर, यह कदम आम तौर पर सिर्फ एक बार किया जाता है, पहली बार स्क्रिप्ट कहा जाता है। कंपाइलर आउटपुट बाद के उपयोगों तक पहुंच को गति देने के लिए कैश्ड है। यदि स्क्रिप्ट को संशोधित किया गया है, हालांकि, संकलन कदम फिर से किया जाता है।

रनटाइम इंजन स्क्रिप्ट चलने पर एएसटी और बायटेकोड चलता है। प्रतीक तालिका का उपयोग चर के मूल्यों को संग्रहीत करने और कार्यों के लिए बाइटकोड पते प्रदान करने के लिए किया जाता है।

बाइटकोड को संकलित करने और रनटाइम में इसकी व्याख्या करने की यह प्रक्रिया उन भाषाओं के लिए विशिष्ट है जो पर्ल, जावा, रूबी, स्मॉलटॉक और अन्य सहित कुछ प्रकार के आभासी रनटाइम मशीन पर चलती हैं।


परिवर्तनीय बाइंडिंग रनटाइम पर होती है, समय संकलन नहीं।

PHP यह भी हल करने का प्रयास नहीं करती है कि संकलन के समय कौन से नाम दायरे में हैं?
बैरी ब्राउन

17

आम तौर पर इसकी व्याख्या की जाती है, लेकिन कुछ समय इसे संकलित के रूप में उपयोग कर सकते हैं और यह वास्तव में प्रदर्शन को बढ़ाता है। इस ऑपरेशन को करने के लिए ओपन सोर्स टूल: hhvm.com


15

PHP एक व्याख्या की गई भाषा है। हालांकि इसे थर्ड पार्टी-टूल्स द्वारा बाईटेकोड में संकलित किया जा सकता है।


2
"बायटेकोड" एक शब्द है जिसे वीएम विशिष्ट छद्म निर्देशों के लिए उपयोग किया जाता है, जो मूल नहीं हैं इसलिए इस संदर्भ में "संकलन" के रूप में नहीं माना जा सकता है।
सेडाट कपापोग्लू

7
"ऑब्जेक्ट कोड" सीपीयू के निर्देश डिकोडर के लिए सिर्फ बायटेकोड है। (आपको नहीं लगता कि CPU में वास्तव में "CMPSB", सही जैसे मूल निर्देश हैं?)
jrockway

11

एक संकलित कोड को कंप्यूटर के सीपीयू द्वारा सीधे निष्पादित किया जा सकता है। यही है, निष्पादन योग्य कोड सीपीयू की मूल भाषा में निर्दिष्ट है

सीपीयू मशीन निर्देशों से किसी भी प्रारूप से रन-टाइम पर व्याख्या की गई भाषाओं के कोड का अनुवाद किया जाना चाहिए। यह अनुवाद दुभाषिया द्वारा किया जाता है।

यह कहना उचित नहीं होगा कि किसी भाषा की व्याख्या या संकलन किया जाता है क्योंकि व्याख्या और संकलन दोनों उस विशेष भाषा के कार्यान्वयन के गुण हैं, कि भाषा की एक संपत्ति । इसलिए, किसी भी भाषा को संकलित या व्याख्या किया जा सकता है - यह सिर्फ इस बात पर निर्भर करता है कि आप किस विशेष कार्यान्वयन का उपयोग कर रहे हैं।

सबसे व्यापक रूप से इस्तेमाल किया जाने वाला PHP कार्यान्वयन Zend Engine द्वारा संचालित होता है और इसे PHP के नाम से जाना जाता है। Zend Engine PHP स्रोत को एक ऐसे प्रारूप में संकलित करता है जिसे वह निष्पादित कर सकता है, इस प्रकार Zend इंजन दुभाषिए के रूप में काम करता है ।


2
" अर्थात्, निष्पादन योग्य कोड CPU की मूल भाषा में निर्दिष्ट है " .. निष्पादन योग्य कोड CPU की मूल भाषा में निर्दिष्ट नहीं है, लेकिन बाइनरी प्रारूप में, CPU की मूल भाषा कुछ भी हो सकती है और जब सॉफ्टवेयर बायनेरिज़ नहीं आती है तो यह इस तरह से है सीपीयू या वह सीपीयू .. एक पूरी तरह से संकलित और निष्पादन योग्य कोड द्विआधारी प्रारूप में होगा ..
हैगवाल

10

यह एक अर्थहीन प्रश्न है। PHP जीसीसी की तरह ही याक (बाइसन) का उपयोग करता है। याक एक "संकलक संकलक" है। याक का आउटपुट एक संकलक है। एक संकलक का आउटपुट "संकलित" है। PHP को yacc के आउटपुट से पार्स किया जाता है। तो यह है, परिभाषा के अनुसार, संकलित।

यदि वह संतुष्ट नहीं है, तो निम्नलिखित पर विचार करें। दोनों php (बाइनरी) और आपके स्रोत कोड को पढ़ते हैं और एक सार वाक्यविन्यास पेड़ का उत्पादन करते हैं। संस्करण 4 और 5 के तहत, php तब प्रोग्राम को बाईटेकोड (संकलन चरण) में अनुवाद करने के लिए पेड़ पर चलता है। आप वल्कन लॉजिक डम्पर का उपयोग करके ओपकोड (जो असेंबली के अनुरूप हैं) द्वारा अनुवादित बाईटेकोड देख सकते हैं । अंत में, php (विशेष रूप से, Zend इंजन) bytecode की व्याख्या करता है। जीसीसी, तुलना में, पेड़ चलता है और विधानसभा को आउटपुट करता है; यह प्रक्रिया को समाप्त करने के लिए कोडांतरक और लिंकर भी चला सकता है। एक कार्यक्रम को एक "व्याख्यायित" द्वारा संभाला जाना और दूसरे "संकलित" द्वारा संभाला गया एक कार्यक्रम निरर्थक है। आखिरकार, दोनों के साथ एक "संकलक" के माध्यम से कार्यक्रम चलाए जाते हैं।

आपको वास्तव में उस प्रश्न को पूछना चाहिए जो आप इसके बजाय पूछना चाहते हैं। ("क्या मैं एक प्रदर्शन दंड का भुगतान करता हूं क्योंकि PHP हर अनुरोध के लिए मेरे स्रोत कोड को फिर से जमा करता है?", आदि)


5
स्रोत कोड को टोकन करना संकलन नहीं है। यहां तक ​​कि VBScript को आपकी परिभाषा के साथ एक संकलित भाषा माना जा सकता है।
सेडाट कपापोग्लू

5
मैं इस पर जॉकवे के साथ हूं, हालांकि यह वास्तव में ओपी के सवाल का जवाब नहीं देता है। यह ऐसी भाषाओं का वर्गीकरण करने का प्रलोभन दे रहा है जिसमें हर भाषा को प्रत्येक श्रेणी में साफ-सुथरा रखा गया हो। लेकिन वास्तविकता इतनी साफ नहीं है। लगभग हर भाषा विशेषताओं का एक मिश्रण है। इसके अलावा, जब आप इसके ठीक नीचे हो जाते हैं, तो भी प्रोसेसर द्वारा देशी मशीन कोड की "व्याख्या" की जाती है।
बैरी ब्राउन

4
आपका उच्च स्तर दावे सही है, तो यह है एक अर्थहीन सवाल। आपका तर्क हालांकि बहुत मददगार नहीं है, आपने जो कुछ किया है वह फजी परिभाषाओं को लिया है और उन्हें चरम सीमा तक ले गया है। संकलन स्रोत का वस्तु कोड में परिवर्तन है। हाँ, आप स्रोत के परिवर्तन को एक ठोस / सार वाक्यविन्यास पेड़ के संकलन में मान सकते हैं, लेकिन इसका मतलब यह नहीं है कि ज्यादातर लोग इसका मतलब क्या है? बावजूद, यह एक अर्थहीन प्रश्न है क्योंकि किसी भाषा का अर्थ संकलित या व्याख्या नहीं है, किसी भाषा के निहितार्थ संकलित या व्याख्या किए जाते हैं।
फालिना

6
आइए देखें कि आदमी एक शुरुआत है। यह मुझे इस सवाल की व्याख्या करता है कि "क्या Zend कार्यान्वयन मूल स्रोत से PHP कोड उत्पन्न करता है?"। मेरे उत्तर की जाँच करें। मुझे लगता है कि आप सवाल पूछने के तरीके के बारे में बहुत सख्त हैं। तुम्हें पता है, हम मदद करने की कोशिश कर रहे हैं, कुछ newbies को मारना नहीं।
सेदत कपपनोग्लू

3
मैं पूरी तरह से सेडैट से सहमत हूं। आप अपने ज्ञान को
डिकर के

10

मुझे पता है कि यह प्रश्न पुराना है, लेकिन यह सभी जगह जुड़ा हुआ है और मुझे लगता है कि यहां सभी उत्तर गलत हैं (शायद इसलिए कि वे पुराने हैं)।

नहीं है कोई एक व्याख्या की भाषा या एक संकलित भाषा के रूप में इस तरह के बात। किसी भी प्रोग्रामिंग भाषा की व्याख्या और / या संकलित की जा सकती है।

सबसे पहले एक भाषा सिर्फ नियमों का एक सेट है, इसलिए जब हम संकलन के बारे में बात कर रहे हैं तो हम उस भाषा के विशिष्ट कार्यान्वयन का उल्लेख करते हैं।

उदाहरण के लिए, HHVM , PHP का एक कार्यान्वयन है। यह कोड को मध्यवर्ती हिपहॉप बाईटेकोड में परिवर्तित करने के लिए जेआईटी संकलन का उपयोग करता है और फिर मशीन कोड में अनुवाद किया जाता है। क्या यह कहने के लिए पर्याप्त है कि यह संकलित है? कुछ जावा कार्यान्वयन (सभी नहीं) भी जेआईटी का उपयोग करते हैं। Google का V8 भी JIT का उपयोग करता है।

संकलित बनाम व्याख्या की पुरानी परिभाषाओं का उपयोग करना आजकल समझ में नहीं आता है।

"क्या PHP संकलित है?" एक गैर-संवेदी प्रश्न है जो कि एक व्याख्या की गई भाषा बनाम संकलित भाषा के बीच स्पष्ट और सहमत नहीं है।

उनका परिसीमन करने का एक संभावित तरीका है (मुझे इस द्वंद्ववाद का कोई मतलब नहीं है):

संकलित भाषाएं समय संकलन (C, C ++) के आगे का उपयोग करती हैं;

व्याख्या की गई भाषाएं बस समय संकलन में या सभी (पायथन, रूबी, पीएचपी, जावा) में संकलन का उपयोग नहीं करती हैं।


हालांकि, ज्यादातर मामलों में जावा समय संकलन के आगे उपयोग नहीं करता है? मैं काफी नया जावा डेवलपर हूं और हम आमतौर पर रनटाइम से पहले अपना कोड तरीका संकलित करते हैं।
एकरेला

@ ककरेल्ला in most cases, हां। सभी मामलों में, नहीं। इसलिए आप एक ऐसी रेखा नहीं खींच सकते जो शब्दार्थ से महत्वपूर्ण और सहमत हो।
क्लॉडिउ क्रेन्गा

2

कम से कम यह संकलन नहीं करता है (या मुझे अनुकूलन कहना चाहिए) कोड को उतना ही चाहिए जितना कोई इसे चाहता है।

यह कोड ...

for($i=0;$i<100000000;$i++);
echo $i;

... इस कार्यक्रम को चलाने में हर बार समान रूप से देरी होती है।

यह पता लगा सकता है कि यह एक गणना है जिसे केवल पहली बार करने की आवश्यकता है।


अब हमारे पास जनरेटर नामक एक विकल्प है।
अंकित विश्वकर्मा

1

स्वीकृत उत्तर स्पष्ट रूप से गलत है। PHP IS संकलित है। कहानी का अंत। शायद देशी निर्देशों के लिए नहीं बल्कि एक व्याख्या किए गए बायोटेक के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.