مستخدم:Mahmoud2013/حرفيات السلاسل النصية

من ويكيبيديا، الموسوعة الحرة

حرفيات السلاسل النصية string literal أو السلسلة النصية المجهولة anonymous string [1] هي نوع من الحرفيات في البرمجة لتمثيل قيمة السلسلة النصية في الكود المصدري لبرنامج حاسوب . غالبًا ما تكون في اللغات الحديثة عبارة عن تسلسل مقتبس من الأحرف (رسميًا " محددات معقوفةbracketed delimiters ") ، كما هو الحال في x = "foo" ، حيث يكون "foo" عبارة عن سلسلة نصية حرفية ذات قيمة foo - رموز الاقتباسات ليست جزءًا من القيمة، و يجب على المرء استخدام طريقة مثل تسلسلات الهروب لتجنب مشكلة تصادم المحدد والسماح للمحدِّدات نفسها أن تكون مضمنة في سلسلة نصية. ومع ذلك، هناك العديد من الترميزات البديلة لتحديد حرفية السلسلة النصية، ولا سيما الحالات الأكثر تعقيدًا، ويعتمد الترميز الدقيق على لغة البرمجة المعنية بشكل فردي. ومع ذلك ، هناك بعض الإرشادات العامة التي تتبعها معظم لغات البرمجة الحديثة.

البناء النحوي[عدل]

محددات بين قوسين[عدل]

تستخدم معظم لغات البرمجة الحديثة محددات الأقواس (أيضًا محددات متوازنة ) لتحديد حرفية السلسلة النصية. الاقتباسات المزدوجة هي محددات الاقتباس الأكثر استخدامًا:

 "مرحبا!" 

يتم كتابة سلسلة فارغة حرفيا بواسطة زوج من علامات الاقتباس بدون حرف على الإطلاق بين:

 "" 

تسمح بعض اللغات أو تفرض استخدام علامات الاقتباس المفردة بدلاً من الاقتباسات المزدوجة (يجب أن تبدأ السلسلة وتنتهي بنفس نوع علامة الاقتباس وقد يعطي نوع علامة الاقتباس أو لا يعطي دلالات مختلفة قليلاً):

 'مرحبا!' 

علامات الاقتباس هذه غير مقترنة (يتم استخدام نفس الحرف كفتحت وأقرب) ، وهو مخلفات من تقنية الآلة الكاتبة التي كانت مقدمة لأجهزة الإدخال والإخراج الكمبيوتر الأقدم.

من حيث التعبيرات العادية ، يتم إعطاء سلسلة حرفية مقتبسة على النحو التالي:

 "[^"] * " 

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

المحددات المقترنة[عدل]

يوفر عدد من اللغات المحددات المزدوجة ، حيث تختلف محددات الفتح والإغلاق. غالبًا ما تسمح هذه أيضًا بالسلاسل المتداخلة ، بحيث يمكن تضمين المحددات ، طالما يتم إقرانها ، ولكنها لا تزال تؤدي إلى تصادم محدد لتضمين محدد إغلاق غير مقترن. تتضمن الأمثلة PostScript ، التي تستخدم الأقواس ، كما في (The quick (brown fox)) the (The quick (brown fox)) و m4 ، والتي تستخدم backtick (`) كمحدد البداية ، والفاصلة العليا (') كمحدد النهاية. يسمح Tcl بالاقتباسات (للسلاسل المحرفية) والأقواس (للسلاسل الأولية) ، كما هو الحال في "The quick brown fox" أو {The quick {brown fox}} ؛ هذا مستمد من الاقتباسات الفردية في قذائف يونيكس واستخدام الأقواس في C للعبارات المركبة ، لأن كتل التعليمات البرمجية في Tcl نحويًا نفس الشيء مثل حرفية السلسلة - التي يتم إقرانها بالمحددات ضرورية لجعل هذا ممكنًا.

في حين أن مجموعة أحرف Unicode تتضمن إصدارات مزدوجة (فتح وإغلاق منفصلة) لكل من الاقتباسات المفردة والمزدوجة ، المستخدمة في النص ، ومعظمها بلغات أخرى غير الإنجليزية ، نادرًا ما يتم استخدامها في لغات البرمجة (لأن ASCII مفضل ، ولا يتم تضمينها في ASCII):

 "مرحبا!"
  'مرحبا!'
  "مرحبا! "
 "مرحبا! » 

يمكن استخدام الاقتباسات المزدوجة المقترنة في Visual Basic. NET ، ولكن العديد من لغات البرمجة الأخرى لن تقبلها. تُفضل العلامات غير المُزدوجة للتوافق ، حيث يسهل كتابتها على نطاق واسع من لوحات المفاتيح ، وحتى في اللغات التي يُسمح بها ، تمنع العديد من المشاريع استخدامها لشفرة المصدر.

محددات المسافة البيضاء[عدل]

قد تنتهي الأحرف الحرفية للسلسلة بخطوط جديدة.

أحد الأمثلة هو معلمات قالب ميدياويكي .

 {{Navbox
 |name=Nulls
 |title=[[wikt:Null|Nulls]] in [[computing]]
 }}

قد يكون هناك بناء جملة خاص للسلاسل متعددة الخطوط. في YAML ، يمكن تحديد حرفية السلسلة بالموضع النسبي للمسافة البيضاء والمسافات البادئة.

  - title: An example multi-line string in YAML
   body : | 
    This is a multi-line string.
    "special" metacharacters may
    appear here. The extent of this string is
    represented by indentation.

لا محددات[عدل]

تسمح بعض لغات البرمجة ، مثل Perl و JavaScript و PHP ، بالحروف السلاسل الحرفية بدون أي محددات في بعض السياقات. في برامج بيرل وجافا سكريبت التالية ، على سبيل المثال ، red green blue هي سلسلة حرفية ، لكنها غير مدرجة:

%map = (red => 0x00f, blue => 0x0f0, green => 0xf00);
map = {red: 0x00f, blue: 0x0f0, green: 0xf00};

يعامل Perl التسلسلات غير المحجوزة للحروف الأبجدية الرقمية على أنها سلسلة حرفية في معظم السياقات. على سبيل المثال ، الخطان التاليان من Perl متساويان:

$y = "x";
$y = x;

تدوين تعريفي[عدل]

في لغة البرمجة FORTRAN الأصلية (على سبيل المثال) ، تمت كتابة حرفية السلسلة في ما يسمى بتدوين <i id="mwUQ">Hollerith</i> ، حيث تبع العد العشري لعدد الأحرف بالحرف H ، ثم أحرف السلسلة:

35HAn example Hollerith string literal

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

مزايا:

  • وبالتالي البحث يزيل النص (على حرف محدد) ويتطلب أقل بكثير النفقات العامة
  • يتجنب مشكلة تصادم المحدد
  • يمكّن من تضمين الحروف الأولية التي قد تُخطئ على أنها أوامر
  • يمكن استخدامها لضغط البيانات بشكل فعال للغاية من سلاسل النص العادي [بحاجة لمصدر] [ بحاجة لمصدر ][ بحاجة لمصدر ]

العيوب:

  • هذا النوع من الترميز عرضة للخطأ إذا تم استخدامه كإدخال يدوي من قبل المبرمجين
  • هناك حاجة إلى رعاية خاصة في حالة ترميزات متعددة البايت

ولكن هذا ليس عيبًا عندما يتم إنشاء البادئة بواسطة خوارزمية كما هو الحال على الأرجح. [بحاجة لمصدر] [ بحاجة لمصدر ]

دوال منشئة[عدل]

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

قبل C ++ 11 ، لم يكن هناك أي حرفية لسلاسل C ++ (يسمح C ++ 11 "this is a C++ string"s مع s في نهاية الحرف) ، لذلك تم استخدام بناء الجملة العادي ، على سبيل المثال:

  • std::string s = "initializer syntax";
  • std::string s("converting constructor syntax");
  • std::string s = string("explicit constructor syntax");

وكلها لها نفس التفسير. منذ C ++ 11 ، هناك أيضًا بنية بناء جديدة:

  • std::string s{"uniform initializer syntax"};
  • auto s = "constexpr literal syntax"s;

تصادم محدد[عدل]

عند استخدام الاقتباس ، إذا رغب المرء في تمثيل المحدد نفسه في سلسلة حرفية ، فإن المرء يواجه مشكلة اصطدام المحدد . على سبيل المثال ، إذا كان المحدد عبارة عن اقتباس مزدوج ، فلا يمكن للمرء ببساطة أن يمثل اقتباسًا مزدوجًا بحد ذاته بالحرف """ حيث يتم تفسير الاقتباس الثاني على أنه نهاية السلسلة الحرفية ، وليس كقيمة السلسلة ، وبالمثل واحد لا يمكن كتابة "This is "in quotes", but invalid." حيث يتم تفسير الجزء الأوسط المقتبس على أنه خارج علامات الاقتباس. هناك العديد من الحلول ، والغرض العام منها هو استخدام تسلسلات الهروب ، مثل "\"" أو "This is \"in quotes\" and properly escaped." وهروب "This is \"in quotes\" and properly escaped." ، ولكن هناك العديد من الحلول الأخرى.

تسمح الاقتباسات المزدوجة ، مثل الأقواس في Tcl ، باستخدام السلاسل المتداخلة ، مثل {foo {bar} zork} ولكنها لا تحل مشكلة تصادم المحدد ، لأنه لا يمكن ببساطة تضمين محدد إغلاق غير متوازن ، كما في {}} .

بمضاعفة[عدل]

هناك عدد من اللغات ، بما في ذلك Pascal و BASIC و DCL و Smalltalk و SQL و J و Fortran ، تتجنب تصادم المحدد عن طريق مضاعفة علامات الاقتباس التي تهدف إلى أن تكون جزءًا من السلسلة الحرفية نفسها:

 'This Pascal string''contains two apostrophes'''
 "I said, ""Can you hear me?"""

اقتباس مزدوج[عدل]

تسمح بعض اللغات ، مثل Fortran و Modula-2 و JavaScript و Python و PHP بأكثر من محدد اقتباس واحد ؛ في حالة وجود محددين محتملين ، يُعرف هذا باسم الاقتباس المزدوج . عادة ، يتكون هذا من السماح للمبرمج باستخدام إما اقتباس واحد أو اقتباس مزدوج بالتبادل - يجب أن تستخدم كل حرفية واحدة أو أخرى.

 "This is John's apple." 
 'I said, "Can you hear me?"'

هذا لا يسمح بالحصول على حرف حرفي واحد مع كلا المحددين فيه. يمكن حل هذه المشكلة باستخدام عدة حِرَف واستخدام سلسلة متسلسلة :

 'I said, "This is ' + "John's" + ' apple."'

يحتوي Python على سلسلة حرفية سلسلة ، لذلك يتم حرفية سلسلة حرفية متتالية حتى بدون عامل ، لذلك يمكن تقليل ذلك إلى:

 'I said, "This is '"John's"' apple."'

يدعم D بعض محددات الاقتباس ، مع هذه السلاسل التي تبدأ بـ q"[ وتنتهي بـ ]" أو بالمثل لحرف المحدد الآخر (أي من () <> {} أو []). يدعم D أيضًا السلاسل على غرار المستند عبر بناء جملة مشابه.

في بعض لغات البرمجة ، مثل sh و Perl ، هناك محددات مختلفة يتم التعامل معها بشكل مختلف ، مثل إجراء استيفاء السلسلة أم لا ، وبالتالي يجب توخي الحذر عند اختيار المحدد الذي يجب استخدامه ؛ انظر أنواع مختلفة من السلاسل أدناه.

اقتباس متعدد[عدل]

ملحق إضافي هو استخدام الاقتباس المتعدد ، والذي يسمح للمؤلف باختيار الأحرف التي يجب أن تحدد حدود سلسلة حرفية.

على سبيل المثال ، في Perl :

qq^I said, "Can you hear me?"^
qq@I said, "Can you hear me?"@
qq§I said, "Can you hear me?"§

كلها تنتج النتيجة المرجوة. على الرغم من أن هذا التدوين أكثر مرونة ، إلا أن القليل من اللغات تدعمه ؛ بخلاف Perl ، يدعم Ruby (متأثرًا بـ Perl) و C ++ 11 أيضًا. في C ++ 11 ، يمكن أن تحتوي السلاسل الخام على محددات مختلفة ، تبدأ بـ R"delimiter( وتنتهي بـ )delimiter" . يمكن أن يكون المحدد من صفر إلى 16 حرفًا ويمكن أن يحتوي على أي عضو من مجموعة أحرف المصدر الأساسية باستثناء أحرف المسافات البيضاء أو الأقواس أو الشرطة المائلة العكسية. أحد أنواع الاقتباسات المتعددة هو استخدام سلاسل نمط المستند هنا . يوفر Lua (اعتبارًا من 5.1) شكلًا محدودًا من علامات الاقتباس المتعددة ، خاصة للسماح بتداخل التعليقات الطويلة أو السلاسل المضمنة. عادة يستخدم المرء [[ and ]] لتحديد السلاسل الحرفية (تجريد سطر جديد أو غير خام) ، ولكن يمكن أن تتضمن أقواس الفتح أي عدد من العلامات المتساوية وإغلاق الأقواس فقط مع نفس عدد العلامات أغلق السلسلة. فمثلا:

local ls = [=[
This notation can be used for Windows paths: 
local path = [[C:\Windows\Fonts]]
]=]

يعد الاقتباس المتعدد مفيدًا بشكل خاص مع التعبيرات العادية التي تحتوي على محددات معتادة مثل علامات الاقتباس ، لأن هذا يتجنب الحاجة إلى الهروب منها. ومثالا مبكرا الحوار الاقتصادي الاستراتيجي ، حيث في الأمر استبدال s/ regex / replacement / الافتراضي مائل / يمكن استبدال المحددات التي كتبها حرف آخر، كما في s, regex, replacement , .

خيار آخر ، نادرًا ما يستخدم في اللغات الحديثة ، هو استخدام دالة لإنشاء سلسلة ، بدلاً من تمثيلها عبر حرفيا. لا يستخدم هذا بشكل عام في اللغات الحديثة لأن الحساب يتم في وقت التشغيل ، وليس في وقت التحليل.

على سبيل المثال ، لم تتضمن الأشكال الأولى من BASIC تسلسلات الهروب أو أي حلول أخرى مدرجة هنا ، وبالتالي كان مطلوبًا بدلاً من ذلك استخدام الدالة CHR$ ، والتي تُرجع سلسلة تحتوي على الحرف المقابل لحجتها. في ASCII ، تكون علامة الاقتباس بالقيمة 34 ، لذلك لتمثيل سلسلة مع علامات الاقتباس في نظام ASCII يمكن للمرء أن يكتب

"I said, " + CHR$(34) + "Can you hear me?" + CHR$(34)

في C ، يتوفر مرفق مماثل عبر sprintf تنسيق %c "حرف" ، على الرغم من عدم وجود حلول أخرى في حالة وجود حلول أخرى:

sprintf("This is %cin quotes.%c", 34, 34);

يمكن أيضًا استخدام وظائف المُنشئ هذه لتمثيل الأحرف غير المطبوعة ، على الرغم من استخدام تسلسلات الهروب بشكل عام بدلاً من ذلك. يمكن استخدام تقنية مشابهة في C ++ باستخدام عامل std::string .

تسلسلات الهروب[عدل]

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

يتم اختيار حرف واحد كبادئة لإعطاء ترميزات للشخصيات التي يصعب أو يستحيل تضمينها مباشرة. الأكثر شيوعًا هو الخط المائل العكسي ؛ بالإضافة إلى الأحرف الأخرى ، فإن النقطة الأساسية هي أن الخط المائل العكسي نفسه يمكن ترميزه على أنه خط مائل مزدوج عكسي \\ وللسلسلة المحددة ، يمكن تشفير المحدد نفسه عن طريق الهروب ، على سبيل المثال بواسطة \" لـ". يمكن إعطاء تعبير عادي لمثل هذه السلاسل الهروب على النحو التالي ، كما هو موجود في مواصفات ANSI C : [2] [أ]

"(\\.|[^\\"])*"

بمعنى "اقتباس ؛ متبوعًا بصفر أو أكثر من إما حرف هارب (خط مائل عكسي متبوع بشيء ، ربما خط مائل عكسي أو اقتباس) ، أو حرف عدم هروب ، غير اقتباس ؛ ينتهي باقتباس" - المشكلة الوحيدة هي التمييز بين إنهاء الاقتباس من اقتباس يسبقه شرطة مائلة للخلف ، والتي قد تنجو من نفسها. يمكن أن تتبع العديد من الأحرف \uFFFF المائلة للخلف ، مثل \uFFFF ، اعتمادًا على مخطط الهروب.

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

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

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

على سبيل المثال ، في سلسلة حرفية C ، إذا كان الخط المائل العكسي متبوعًا بحرف مثل "b" أو "n" أو "t" ، فإن هذا يمثل حرف مسافة غير مطبوعة أو سطر جديد أو حرف علامة تبويب على التوالي. أو إذا كان الخط المائل عكسيًا متبوعًا بـ 1-3 أرقام ثمانية ، فسيتم تفسير هذا التسلسل على أنه يمثل الحرف التعسفي برمز ASCII المحدد. تم توسيع هذا لاحقًا للسماح بتدوين رمز الأحرف السداسي العشري الأكثر حداثة:

"I said,\t\t\x22Can you hear me?\x22\n"
تسلسل الهروب يونيكود يتم وضع الأحرف الحرفية في السلسلة
\ 0 يو + 0000 حرف فارغ [3] [4]



</br> (عادة كحالة خاصة لتدوين \ ooo ثماني)
يو + 0007 تنبيه [5] [6]
يو + 0008 مسافة للخلف
\F ش + 000 ج تغذية النموذج
U + 000A تغذية السطر (أو السطر الجديد في POSIX)
\ r يو + 000 د حرف الإرجاع (أو سطر جديد في Mac OS 9 والإصدارات الأقدم)
\ t يو + 0009 علامة تبويب أفقية
\الخامس يو + 000 ب علامة تبويب عمودية
\ هـ U + 001B حرف الهروب ( GCC ، [7] clang and tcc )
\ u #### U + #### حرف Unicode 16 بت حيث #### عبارة عن أربعة أرقام ست عشرية
\ U ######## U + ###### حرف Unicode 32 بت حيث تتكون ######## من ثمانية أرقام سداسية (مساحة أحرف Unicode حاليًا بعرض 21 بت فقط ، لذا سيكون أول رقمين سداسيين صفرًا دائمًا)
\ u {######} U + ###### حرف Unicode 21 بت حيث ###### هو عدد متغير من الأرقام السداسية
\ x ## U + 00 ## مواصفات حرف 8 بت حيث # هو رقم ست عشري
\ ooo U + 0 ### مواصفات شخصية من 8 بتات حيث o عبارة عن رقم ثماني
\ " يو + 0022 اقتباس مزدوج (")
\ & حرف غير مستخدم لتعيين الهروب الرقمي في هاسكل
\ ' يو + 0027 اقتباس واحد (')
\\ U + 005C الشرطة المائلة للخلف (\)
U + 003F علامة استفهام (؟ )

و

الهروب المتداخل[عدل]

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

يمكن أن يمثل الاقتباس غير الصحيح للسلاسل المتداخلة ثغرة أمنية. يجب أن يستخدم استخدام البيانات غير الموثوق بها ، كما هو الحال في حقول البيانات لاستعلام SQL ، عبارات معدة لمنع هجوم إدخال التعليمات البرمجية . في PHP 2 إلى 5.3 ، كانت هناك ميزة تسمى علامات الاقتباس السحرية التي تهرب أوتارًا من السلاسل (للراحة والأمن) ، ولكن بسبب إزالة المشاكل من الإصدار 5.4 وما بعده.

سلاسل خام[عدل]

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

تكون السلاسل الأولية مفيدة بشكل خاص عندما يلزم الهروب من حرف مشترك ، لا سيما في التعبيرات العادية (المتداخلة كحرف سلسلة) ، حيث يتم استخدام الشرطة المائلة للخلف \ على نطاق واسع ، وفي مسارات DOS / Windows ، حيث يتم استخدام الشرطة المائلة للخلف كفاصل مسار. يُعرف وفرة الخطوط المائلة العكسية باسم متلازمة مسواك الميلان ، ويمكن تقليلها باستخدام الأوتار الخام. قارن أسماء المسار الهاربة والخام في C #:

 "The Windows path is C:\\Foo\\Bar\\Baz\\"
 @"The Windows path is C:\Foo\Bar\Baz\"

تحدث الأمثلة القصوى عندما يتم دمجها - تبدأ مسارات اصطلاح التسمية الموحدة بـ \\ ، وبالتالي فإن التعبير العادي الهروب المطابق لاسم UNC يبدأ بـ 8 خطوط مائلة عكسية ، "\\\\\\\\" ، بسبب الحاجة إلى الهروب من السلسلة والتعبير العادي. يؤدي استخدام السلاسل الأولية إلى تقليل ذلك إلى 4 (الهروب في التعبير العادي) ، كما هو الحال في C # @"\\\\" . في مستندات XML ، تسمح أقسام CDATA باستخدام أحرف مثل & و < بدون محلل XML الذي يحاول تفسيرها كجزء من بنية المستند نفسه. يمكن أن يكون هذا مفيدًا عند تضمين نص حرفي وكود برمجة نصية ، للحفاظ على المستند جيدًا .

<![CDATA[ if (path!=null && depth<2) { add(path); } ]]>

سلسلة حرفية متعددة الخطوط[عدل]

في العديد من اللغات ، يمكن أن تحتوي أحرف السلاسل الحرفية على خطوط حرفية جديدة ، تمتد عبر عدة أسطر. بدلاً من ذلك ، يمكن الهروب من الخطوط الجديدة ، في أغلب الأحيان \n . فمثلا:

echo 'foo
bar'

تشمل اللغات التي تسمح بخطوط حرفية جديدة bash و Lua و Perl و PHP و R و Tcl. في بعض اللغات الأخرى ، لا يمكن أن تحتوي السلاسل الحرفية على خطوط جديدة.

echo -e "foo\nbar"

كلاهما باش صالح ، ينتج:

 فو
شريط 

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

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

Python ، التي لا تسمح أحرفها الحرفية المعتادة بخطوط حرفية جديدة ، بدلاً من ذلك لديها شكل خاص من السلسلة ، مصمم للحروف متعددة الأسطر ، تسمى الاقتباس الثلاثي . تستخدم هذه محددًا ثلاثيًا ، إما ''' أو """ . تُستخدم هذه الحرف بشكل خاص في التوثيق المضمن ، والمعروف باسم docstrings .

يسمح Tcl بخطوط حرفية جديدة في السلاسل ولا يحتوي على بنية خاصة للمساعدة في السلاسل المتعددة الأسطر ، على الرغم من أنه يمكن وضع المحددات على الخطوط بمفردها وتمييز الخطوط الجديدة الزائدة وتتبعها عبر string trim ، بينما يمكن استخدام string map لإزالة المسافة البادئة.

سلسلة تسلسل حرفية[عدل]

توفر بعض اللغات سلسلة متسلسلة حرفية ، حيث يتم ضم حرفية السلسلة المجاورة بشكل ضمني إلى حرفية واحدة في وقت الترجمة. هذه سمة من سمات C ، [8] [9] C ++ ، [10] D ، [11] روبي ، [12] و Python ، [13] التي نسختها من C. [14] والجدير بالذكر أن هذا التسلسل يحدث عند الترجمة الوقت ، أثناء التحليل المعجمي (كمرحلة بعد الترميز الأولي) ، ويتناقض مع كل من سلسلة سلسلة وقت التشغيل (بشكل عام مع عامل التشغيل + ) [15] والتسلسل أثناء الطي المستمر ، والذي يحدث في وقت الترجمة ، ولكن في مرحلة لاحقة (بعد تحليل العبارة أو "التحليل"). معظم اللغات ، مثل C # و Java [16] و Perl ، لا تدعم التسلسل الحرفي للسلسلة الضمنية ، وبدلاً من ذلك تتطلب تسلسلًا صريحًا ، كما هو الحال مع عامل التشغيل + (هذا ممكن أيضًا في D و Python ، ولكن غير قانوني في C / C ++ - انظر أدناه)؛ في هذه الحالة ، قد يحدث التسلسل في وقت الترجمة ، عن طريق الطي المستمر ، أو قد يتم تأجيله إلى وقت التشغيل.

التحفيز[عدل]

في لغة C ، حيث نشأ المفهوم والمصطلح ، تم إدخال سلسلة حرفية لسلسلة لسببين: [17]

  • للسماح للسلاسل الطويلة بامتداد خطوط متعددة مع مسافة بادئة مناسبة على عكس استمرار الخط ، مما يدمر مخطط المسافة البادئة ؛ و
  • للسماح ببناء حرفية السلسلة بواسطة وحدات الماكرو (عبر التوحيد ). [18]

من الناحية العملية ، يسمح هذا بسلسلة متسلسلة في المراحل المبكرة من التجميع ("الترجمة" ، على وجه التحديد كجزء من التحليل المعجمي) ، دون الحاجة إلى تحليل العبارة أو الطي المستمر. على سبيل المثال ، ما يلي صالح C / C ++:

char *s = "hello, " "world";
printf("hello, " "world");

ومع ذلك ، ما يلي غير صالح:

char *s = "hello, " + "world";
printf("hello, " + "world");

ويرجع ذلك إلى أن حرفية السلسلة تحتوي على نوع صفيف ، char [ n ] (C) أو const char [ n ] (C ++) ، والتي لا يمكن إضافتها ؛ هذا ليس قيد في معظم اللغات الأخرى. هذا مهم بشكل خاص عند استخدامه بالاشتراك مع المعالج المسبق C ، للسماح بحساب السلاسل بعد المعالجة المسبقة ، خاصة في وحدات الماكرو. [14] كمثال بسيط:

char *file_and_message = __FILE__ ": message";

سيتم توسيع (إذا كان الملف يسمى ac) إلى:

char *file_and_message = "a.c" ": message";

ثم يتم تسلسلها ، بما يعادل:

char *file_and_message = "a.c: message";

إحدى حالات الاستخدام الشائعة في إنشاء سلاسل تنسيق printf أو scanf ، حيث يتم توفير محددات التنسيق بواسطة وحدات الماكرو. [19] [20] يستخدم مثال أكثر تعقيدا stringification من الأعداد الصحيحة (من قبل المعالج) لتعريف الماكرو الذي يتسع لسلسلة من سلسلة حرفية، التي يتم بعد ذلك متصلا إلى حرفي سلسلة واحدة مع اسم الملف ورقم السطر: [21]

#define STRINGIFY(x) #x 
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)

أبعد من المتطلبات النحوية لـ C / C ++ ، فإن التسلسل الضمني هو شكل من أشكال السكر النحوي ، مما يجعل من الأسهل تقسيم الحروف الحرفية عبر عدة خطوط ، وتجنب الحاجة إلى استمرار الخط (عبر الخطوط المائلة للخلف) والسماح للمرء بإضافة التعليقات إلى أجزاء من السلاسل. على سبيل المثال ، في Python ، يمكن للمرء أن يعلق على تعبير عادي بهذه الطريقة: [22]

re.compile("[A-Za-z_]"    # letter or underscore 
      "[A-Za-z0-9_]*"  # letter, digit or underscore
     )

مشاكل[عدل]

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

l = ['foo', 
   'bar'
   'zork']

وفقًا لذلك ، لا يتم استخدامه في معظم اللغات ، وقد تم اقتراحه للإيقاف من D [23] و Python. [14] ومع ذلك ، فإن إزالة الميزة تخرق التوافق العكسي ، واستبدالها بعامل تسلسل يقدم مشكلات الأسبقية - يحدث التسلسل الحرفي للسلسلة أثناء lexing ، قبل تقييم المشغل ، ولكن التسلسل عبر عامل صريح يحدث في نفس الوقت مثل العوامل الأخرى ، وبالتالي الأسبقية هي مشكلة قد تتطلب أقواس لضمان ترتيب التقييم المطلوب.

هناك مشكلة أكثر دقة هي أنه في C و C ++ ، [24] هناك أنواع مختلفة من حرفية السلسلة ، وسلسلة من هذه لها سلوك محدد للتنفيذ ، مما يشكل خطرًا أمنيًا محتملاً. [25]

أنواع مختلفة من الخيوط[عدل]

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

أحد أقدم الأمثلة هو في النصوص البرمجية ، حيث تشير علامات الاقتباس المفردة إلى سلسلة أولية أو "سلسلة حرفية" ، في حين أن علامات الاقتباس المزدوجة لها تسلسلات هروب واستيفاء متغير.

على سبيل المثال ، في Python ، تسبق السلاسل الخام r أو R - قارن 'C:\\Windows' مع r'C:\Windows' (على الرغم من أن سلسلة Python الخام لا يمكن أن تنتهي بعدد فردي من الخطوط المائلة العكسية). يميز Python 2 أيضًا نوعين من السلاسل: سلاسل ASCII ("بايت") ذات 8 بت (الافتراضي) ، المشار إليها صراحةً ببادئة b أو B ، وسلاسل Unicode ، المشار إليها ببادئة u أو U [26]

تدوين C # للسلاسل الأولية يسمى @ -quoting.

@"C:\Foo\Bar\Baz\"

في حين أن هذا يعطل الهروب ، فإنه يسمح بعلامات الاقتباس المزدوجة ، والتي تسمح للمرء بتمثيل علامات الاقتباس داخل السلسلة:

@"I said, ""Hello there."""

في Tcl ، تكون السلاسل المحددة بأقواس حرفية ، بينما الأوتار المحددة بعلامات اقتباس لها هروب واستيفاء. تحتوي Perl على مجموعة متنوعة من السلاسل ، والتي تعتبر عوامل أكثر رسمية ، وتعرف باسم عوامل الاقتباس والعلامات المشابهة . وهي تشمل كلاً من بناء الجملة المعتاد (محددات ثابتة) وبنية عامة ، تسمح باختيار المحددات ؛ وتشمل هذه: [27]

'' "" `` // m// qr// s/// y/// 
q{} qq{} qx{} qw{} m{} qr{} s{}{} tr{}{} y{}{}

يستخدم REXX أحرف لاحقة لتحديد الأحرف أو السلاسل باستخدام الرمز الست عشري أو الثنائي. على سبيل المثال ،

'20'x 
"0010 0000"b
"00100000"b

كلها تعطي حرف المسافة ، متجنبة استدعاء الوظيفة X2C(20) .

استيفاء متغير[عدل]

تختلف اللغات حول ما إذا كان سيتم تفسير حرفية الأوتار على أنها "خام" أو "متغير محرف" وكيفية ذلك. الاستيفاء المتغير هو عملية تقييم تعبير يحتوي على متغير واحد أو أكثر ، وإرجاع الإخراج حيث يتم استبدال المتغيرات بقيمها المقابلة في الذاكرة. في قذائف يونيكس المتوافقة مع sh (بالإضافة إلى Perl و Ruby) ، يتم استيفاء السلاسل المفصولة بعلامات اقتباس (") ، بينما لا يتم استخدام السلاسل المفصولة بفواصل علوية ( ' ). على سبيل المثال ، كود بيرل التالي:

$name   = "Nancy"; 
$greeting = "Hello World";
print "$name said $greeting to the crowd of people.";

ينتج الناتج:

 قالت نانسي مرحبًا World إلى حشد من الناس. 

يتم تفسير حرف سيجيل ($) للإشارة إلى الاستيفاء المتغير.

وبالمثل ، تنتج دالة printf نفس الناتج باستخدام ترميز مثل:

printf "%s said %s to the crowd of people.", $name, $greeting;

تشير الحروف الأولية (٪ s) إلى استيفاء متغير. هذا يتعارض مع السلاسل "الخام":

print '$name said $greeting to the crowd of people.';

التي تنتج مخرجات مثل:

هنا الأحرف $ ليست سيجيلات ، ولا يتم تفسيرها على أنها تحمل أي معنى غير النص العادي.

تضمين كود المصدر في حرفية السلسلة[عدل]

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

فمثلا:

  • كتابة التعليمات البرمجية لإنتاج quines
  • توليد لغة مخرجات من داخل قالب الويب ؛
  • باستخدام XSLT لإنشاء XSLT أو SQL لإنشاء المزيد من SQL
  • إنشاء تمثيل PostScript للمستند لأغراض الطباعة ، من داخل تطبيق معالجة المستندات المكتوب بلغة C أو أي لغة أخرى.
  • كتابة تظليل

ومع ذلك ، فإن بعض اللغات يتم تكييفها جيدًا بشكل خاص لإنتاج هذا النوع من المخرجات المتشابهة ذاتيًا ، خاصة تلك التي تدعم خيارات متعددة لتجنب تصادم المحدد.

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

أنظر أيضا[عدل]

  • حرف حرفي
  • حرفي XML
  • Sigil (برمجة الكمبيوتر)
  1. ^ The regex given here is not itself quoted or escaped, to reduce confusion.

المراجع[عدل]

  1. ^ "Introduction To Java - MFC 158 G". String literals (or constants) are called 'anonymous strings'
  2. ^ "ANSI C grammar (Lex)". liu.se. اطلع عليه بتاريخ 2016-06-22.
  3. ^ "Appendix B. Characters, strings, and escaping rules". realworldhaskell.org. اطلع عليه بتاريخ 2016-06-22.
  4. ^ "String". mozilla.org. اطلع عليه بتاريخ 2016-06-22.
  5. ^ "Escape Sequences (C)". microsoft.com. اطلع عليه بتاريخ 2016-06-22.
  6. ^ "Rationale for International Standard - Programming Languages - C" (PDF). 5.10. أبريل 2003. ص. 52, 153–154, 159. مؤرشف من الأصل (PDF) في 2016-06-06. اطلع عليه بتاريخ 2010-10-17.
  7. ^ "6.35 The Character <ESC> in Constants"، GCC 4.8.2 Manual، اطلع عليه بتاريخ 2014-03-08
  8. ^ C11 draft standard, WG14 N1570 Committee Draft — April 12, 2011, 5.1.1.2 Translation phases, p. 11: "6. Adjacent string literal tokens are concatenated."
  9. ^ C syntax: String literal concatenation
  10. ^ C++11 draft standard, "Working Draft, Standard for Programming Language C++" (PDF)., 2.2 Phases of translation [lex.phases], p. 17: "6. Adjacent string literal tokens are concatenated." and 2.14.5 String literals [lex.string], note 13, p. 28–29: "In translation phase 6 (2.2), adjacent string literals are concatenated."
  11. ^ D Programming Language, Lexical Analysis, "String Literals": "Adjacent strings are concatenated with the ~ operator, or by simple juxtaposition:"
  12. ^ ruby: The Ruby Programming Language، Ruby Programming Language، 19 أكتوبر 2017، اطلع عليه بتاريخ 2017-10-19
  13. ^ The Python Language Reference, 2. Lexical analysis, 2.4.2. String literal concatenation: "Multiple adjacent string literals (delimited by whitespace), possibly using different quoting conventions, are allowed, and their meaning is the same as their concatenation."
  14. ^ أ ب ت Python-ideas, "Implicit string literal concatenation considered harmful?", Guido van Rossum, May 10, 2013
  15. ^ The Python Language Reference, 2. Lexical analysis, 2.4.2. String literal concatenation: "Note that this feature is defined at the syntactical level, but implemented at compile time. The ‘+’ operator must be used to concatenate string expressions at run time."
  16. ^ "Strings (The Java™ Tutorials > Learning the Java Language > Numbers and Strings)". Docs.oracle.com. 28 فبراير 2012. اطلع عليه بتاريخ 2016-06-22.
  17. ^ Rationale for the ANSI C Programming Language. Silicon Press. 1990. ص. 31. ISBN:0-929306-07-4. {{استشهاد بكتاب}}: الوسيط |ref=harv غير صالح (مساعدة), 3.1.4 String literals: "A long string can be continued across multiple lines by using the backslash-newline line continuation, but this practice requires that the continuation of the string start in the first position of the next line. To permit more flexible layout, and to solve some preprocessing problems (see §3.8.3), the Committee introduced string literal concatenation. Two string literals in a row are pasted together (with no null character in the middle) to make one combined string literal. This addition to the C language allows a programmer to extend a string literal beyond the end of a physical line without having to use the backslash-newline mechanism and thereby destroying the indentation scheme of the program. An explicit concatenation operator was not introduced because the concatenation is a lexical construct rather than a run-time operation."
  18. ^ Rationale for the ANSI C Programming Language. Silicon Press. 1990. ص. 6566. ISBN:0-929306-07-4. {{استشهاد بكتاب}}: الوسيط |ref=harv غير صالح (مساعدة), 3.8.3.2 The # operator: "The # operator has been introduced for stringizing. It may only be used in a #define expansion. It causes the formal parameter name following to be replaced by a string literal formed by stringizing the actual argument token sequence. In conjunction with string literal concatenation (see §3.1.4), use of this operator permits the construction of strings as effectively as by identifier replacement within a string. An example in the Standard illustrates this feature."
  19. ^ C/C++ Users Journal, Volume 19, p. 50
  20. ^ "python - Why allow concatenation of string literals?". Stack Overflow. اطلع عليه بتاريخ 2016-06-22.
  21. ^ "LINE__ to string (stringify) using preprocessor directives". Decompile.com. 12 أكتوبر 2006. اطلع عليه بتاريخ 2016-06-22.
  22. ^ The Python Language Reference, 2. Lexical analysis, 2.4.2. String literal concatenation: "This feature can be used to reduce the number of backslashes needed, to split long strings conveniently across long lines, or even to add comments to parts of strings, for example:
  23. ^ DLang's Issue Tracking System – Issue 3827 - Warn against and then deprecate implicit concatenation of adjacent string literals
  24. ^ C++11 draft standard, "Working Draft, Standard for Programming Language C++" (PDF)., 2.14.5 String literals [lex.string], note 13, p. 28–29: "Any other concatenations are conditionally supported with implementation-defined behavior."
  25. ^ "Archived copy". مؤرشف من الأصل في 2014-07-14. اطلع عليه بتاريخ 2014-07-03.{{استشهاد ويب}}: صيانة الاستشهاد: الأرشيف كعنوان (link)
  26. ^ "2. Lexical analysis — Python 2.7.12rc1 documentation". python.org. اطلع عليه بتاريخ 2016-06-22.
  27. ^ "perlop - perldoc.perl.org". perl.org. اطلع عليه بتاريخ 2016-06-22.

روابط خارجية[عدل]