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

الأجزاء الرئيسية من Swift ، بالطبع ، هي المترجم ومكتبة الوظائف القياسية. تتطور بالتوازي ولا تنفصل عملياً عن بعضها البعض.
المترجم مكتوب بلغة C ++ ، والجزء الرئيسي من stdlib هو Swift. ومع ذلك ، فإن اللغة المستخدمة فيه لديها العديد من الميزات:
- المكتبة القياسية من خلال وحدة مدمجة لديها حق الوصول المباشر إلى وظائف المترجم. هذا يسمح لها بالوصول إلى تمثيلات اللغة منخفضة المستوى والمؤشرات الأولية.
- لا تستخدم المكتبة القياسية معدل الوصول الخاص. بدلاً من ذلك ، تبدأ أسماء الكيانات غير العامة بتسطير أسفل السطر. اقرأ المزيد هنا .
- يستخدم إنشاء التعليمات البرمجية باستخدام الأداة المساعدة Generate Your Boilerplate (GYB) لتقليل التكرار في رمز المكتبة القياسية.
ترتبط المكتبة القياسية عادةً بالحاويات والوظائف المفيدة التي تعمل على تبسيط حياة المطور ، ولكن هذا جزء واحد فقط. في المجموع ، يمكن تمييز 3 مكونات الأكثر إثارة للاهتمام:
- الأساسية نواة بجميع بروتوكولاتها وأنواع البيانات والوظائف. المصادر .
- وقت التشغيل طبقة متوسطة بين المكتبة القياسية والمترجم. وهو مسؤول عن كتابة النوع ، والعمل مع الذاكرة ، والتفكير والميزات الديناميكية الأخرى للغة. مكتوب في C ++ والهدف C. المصادر .
- تراكيب SDK. الأغطية على Foundation وغيرها من أطر النظام التي تجعل الوصول إليها من Swift أكثر ملاءمة. المصادر .
مشاريع فرعية أخرى

بالإضافة إلى المترجم والمكتبة القياسية ، هناك العديد من المشاريع الفرعية الأخرى في المجال العام. بعضها مدرج أدناه.
سورسكيت
إطار دعم IDE : الفهرسة ، وتسليط الضوء على بناء الجملة ، واستكمال التعليمات البرمجية وهلم جرا.
SourceKit-LSP
تطبيق LSP لـ Swift ، بناءً على SourceKit. يمكنك أن تقرأ عن ما هو هنا .
مدير الحزمة السريعة
مدير الحزم للمشاريع على سويفت.
مؤسسة
مكتبة Port of Foundation ، والتي تعد واحدة من لب نظام تشغيل Apple لأنظمة الطرف الثالث.
libdispatch (gcd)
GCD لمنصات الطرف الثالث.
XCTest
XCTest لمنصات الطرف الثالث.
LLDB
LLDB مع دعم سويفت و REPL.
دعم الملعب
يتضمن المشروع إطارين - PlaygroundSupport و PlaygroundLogger. أنها توفر التفاعل مع Xcode وعرض جميل للبيانات ، على التوالي.
بناء
بناء النظام .
gyb
فائدة لتوليد الكود.
libcxx
تنفيذ مكتبة C ++ القياسية.
مترجم سريع

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

يستخدم برنامج التحويل البرمجي Swift LLVM كواجهة خلفية. LLVM هو مشروع كبير يتضمن العديد من التقنيات. يعتمد على التمثيل الوسيط (IR). هذا تمثيل عالمي للكود الوسيط يمكن تحويله إلى تعليمة برمجية قابلة للتنفيذ على أي نظام أساسي تدعمه LLVM.
إذا ظهرت بنية جديدة ، فستكون كافية لإضافة LLVM في توليد رمز الجهاز من IR لهذا النظام الأساسي. بعد ذلك ، جميع اللغات التي يوجد بها مترجم مع توليد IR ستدعم هذه البنية.
من ناحية أخرى ، لإنشاء مترجم للغة برمجة جديدة ، يكفي كتابة ترجمة الكود المصدري في IR ، وسوف يهتم LLVM بالعديد من البنى.
ميزة أخرى لمثل هذا النظام هي أن LLVM يمكنه تحسين العرض التقديمي المتوسط ، وقد لا تشارك الواجهة الأمامية في التحسين. هذا يبسط كثيرا تطوير مترجم.
IR لديه ثلاثة أنواع من العرض:
- شجرة الكائنات في الذاكرة. يتوافق كل كائن مع كيان معين في التعليمات البرمجية المصدر: دالة ، عامل تشغيل ، خط ، مؤشر ، وما إلى ذلك. يتم إنشاء هذه الشجرة بواسطة الواجهة الأمامية في مرحلة توليد الأشعة تحت الحمراء.
- عرض النص. يمكن استنتاج IR ككود مصدر منخفض المستوى. يمكن حفظها في ملف وتنفيذها باستخدام المترجم الفوري.
- تنسيق البت المتسلسل "bitcode" (يجب عدم الخلط بينه وبين الكود ، والذي يُستخدم ، على سبيل المثال ، في Java). يمكن استخدامه كنتيجة نهائية للواجهة الخلفية ونقلها إلى الرابط للتحسين على مستوى الارتباط. سيتم تنفيذ التحويل إلى رمز الجهاز في هذه الحالة بواسطة الرابط.
Linker هو برنامج يقوم بإنشاء ملف قابل للتنفيذ. وصفها هو خارج نطاق المقال.
يمكن العثور على الكود المصدري لإصدار LLVM المستخدم في Swift هنا ، والوثائق على الموقع الرسمي.
كما ترون ، نشرت شركة Apple الكثير من المشاريع المثيرة للاهتمام حول الوصول المفتوح. سأتحدث في الجزء التالي عن تحليل الملف المصدر وإنشاء AST.