كيف خلقت YP ومترجم له لمدة 12 عاما



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

مرحبا القارئ! اسمي ألكسندر ، لقد ولدت في مدينة صغيرة (أقل من 10000 شخص) في بيلاروسيا. عائلتي كانت فقيرة ، كان هناك عدد قليل جدا من الألعاب ، عن الكمبيوتر وأي لوحات المفاتيح على الإطلاق ، لا يمكنك تلعثم. على الرغم من حقيقة أن الأسرة كانت فقيرة ، لم يكن لدى الأم أقارب فقراء ، الذين قدموا لنا في بعض الأحيان بعض الأشياء غير الرخيصة. ثم في أحد الأيام (في مكان ما في عام 2001) يعطينا نفس هؤلاء الأقارب جهاز كمبيوتر بايت (التناظرية السوفيتية لجهاز ZX Spectrum 48k). فرحي لا يعرف حدودا! بدأت على الفور إطلاق ألعاب عليها. تم تنزيل الألعاب الموجودة على هذا الكمبيوتر من أشرطة أشرطة عادية. استغرق تنزيل لعبة واحدة حوالي 5 دقائق ، وبدون أي احتمال صغير كان يمكن أن يتوقف بسبب إشارة ذات نوعية رديئة. لزيادة احتمالية نجاح التنزيل ، اضطررت إلى مسحه بالكحول وضبط موضع رأس القراءة لمسجل الشريط. كل هذا الشامانية أثناء التحميل ، ومدة التحميل وعدم القدرة على الاستمرار في الألعاب ، أدى إلى حقيقة أنني بدأت تدريجيا في فقدان الاهتمام بالألعاب. لكن إلى جانب Byte ، تم تقديم كتاب عن العمل مع هذا الكمبيوتر. قررت قراءة هذا الكتاب لمعرفة المزيد عن ميزات بايت. تحول الكتاب إلى كتاب مدرسي عن لغة البرمجة الأساسية المضمنة في البايت.

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

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

بعد التخرج من الصف التاسع من المدرسة ، كان لي خيار إما الذهاب إلى أي كلية أو الذهاب إلى الصف العاشر. قررت الذهاب إلى مدرسة ثانوية متخصصة في مشغل كمبيوتر مع دراسة متعمقة للفيزياء والرياضيات وعلم الفلك وعلوم الكمبيوتر. قال كثير من الناس أنه إذا تخرجت من هذا التخصص ، فسيكون من الأسهل بالنسبة لي دخول الجامعة كمبرمج. لقد أعطيت ثلاث ساعات لحل امتحان القبول ، وكنت أستخدم 30 دقيقة فقط ، منها 10 تم التحقق من صحة كل شيء. دخلت! في مدرسة ليسيوم ، استمرت في دراسة Pascal ، لكنني بدأت أيضًا في دراسة Photoshop و Corel Draw و Excel و سطر أوامر Windows وملفات .bat.

عند معرفة ما فعلته ، أعطاني نفس الأقارب الذين قدموا لي "بايت" جهاز كمبيوتر جديدًا يتميز بالخصائص التالية: أحادية النواة Intel Celeron 800 MHz و 64 ميجابايت من ذاكرة الوصول العشوائي و 14 جيجابايت محرك الأقراص الصلبة والفيديو المدمج بدقة 640 × 480 و 16 لونا أقلع أولياء الأمور وقاموا بالترقية عن طريق شراء 64 ميغابايت من ذاكرة الوصول العشوائي وبطاقة فيديو Matrox Milenium g400 16 ميجا بايت ، مع دعم 16 مليون لون ، وكان القرار 800 × 600 (حدود الشاشة). في ذلك الوقت ، لم يكن بإمكان أي شخص الوصول إلى الإنترنت تقريبًا ، فكل المعلومات مأخوذة بشكل أساسي من الأقراص التي تم بيعها في المتاجر.

اشترى أحد أصدقائي العديد من الأقراص المدمجة لبرمجة دلفي ، وشملت الأقراص المدمجة بورلاند دلفي 7 ، ومجموعة من البرامج التعليمية ، ومجموعة من المكونات وبرنامج مع الكثير من الأسئلة حول دلفي وإجابات على هذه الأسئلة (نوع من StackOverflow دون الحد الأدنى).

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

قال الصديق نفسه الذي قدمني إلى دلفي إن شركة معينة ترسل أقراصًا مجانية مع بعض أوبونتو وكوبونتو. لم أكن أعرف حتى ما كان عليه ، لكنه أعطاني قرصين مجانًا. لم يبدأ أوبونتو بي ، لكن كوبونتو بدأ ويعمل بشكل جيد للغاية. لقد دهشت - اتضح أن هناك شيء آخر إلى جانب ويندوز ودوس. أردت حقًا وضع Kubuntu على الكمبيوتر ودراسته ، لكن محرك الأقراص بسرعة 14 جيجا كان ضده بشكل قاطع. بالإضافة إلى ذلك ، بحلول هذا الوقت كان لدي بالفعل وصول إلى الإنترنت (5 كيلو بايت / ثانية) ، ولم يعمل المودم في Kubuntu. لذلك ، ألقيت القرص مع Kubuntu على الرف. فجأة ، بدأ الصديق نفسه يهذي مع نوع من المجمعات ، وأظهر لي كل شيء نوعًا من البرامج عليه ، لكنهم جعلوني ابتسم فقط ، لأن 50 سطرًا من المجمّع تم استبدالها بسطر واحد من دلفي ، لكن صديقًا أقنعني بمحاولة وأعطاني قرصًا باستخدام FASM وكتب التجميع. لم يعجبني المجمع ، على الرغم من أن وحدات الماكرو في FASM شيء رائع.

وهكذا تخرجت من المدرسة الثانوية ، لقد حان الوقت للذهاب إلى الكلية. لكن قبل فترة قصيرة من نهاية المدرسة ، بدأت في كسب المال على الإنترنت. هناك الكثير من المحتالين على الإنترنت الذين يدعون أنهم رواد أعمال ناجحون ويقدمون للمستخدمين المطمئنين الصفقة التالية - "أعطنا دولارًا على الأقل ، وبعد أسبوعين سنقوم برد مبلغ 2 دولار". إذا أعطيت دولارًا لهؤلاء المحتالين ، فمن الغريب أن يعودوا بعد أسبوعين فعليًا إلى دولارين ، لكن إذا أعطيت 10 دولارات بعد أسبوعين ، فسيتم الإشارة إلى أن لدي 20 دولارًا في حسابي ، لكن سيكون من المستحيل سحبها. لقد قمت بإنشاء الكثير من صناديق البريد واستخدام صناديق البريد المختلفة وتغيير عنوان IP (كان لدي الملكية الفكرية الديناميكية) ، لقد سجلت الكثير من الحسابات على مواقع الاحتيال ، ووضع 1 دولار عليها في كل مرة. بالنظر إلى أنني كسبت بالفعل القليل من المال بهذه الطريقة ، بدأت في زيارتي للفكر - "ربما لا ينبغي علي الذهاب إلى الجامعة؟ يمكنني البرنامج كما أحب دون جامعة. " كنت أميل أيضًا إلى هذا التفكير من خلال حقيقة أن الإنترنت غالبًا ما كتب أن المبرمج لا يحتاج إلى برج. بينما كنت أفكر في "العمل أو عدم التصرف؟" ، قررت الحياة نفسها بالنسبة لي. اشترك أبي في موقع مواعدة ، ووجد حبًا جديدًا له وألقى بي مع والدته. أدركت أن والدتي وحدها لن تكون قادرة على دعم لي أثناء دراستي ، لم أبدأ بدخول الجامعة. بعد الليسيوم ، اضطررت للعمل لمدة عام في بعض المشاريع. حصلت على وظيفة في محل بقالة ، وشاركت في استخراج TTN وإدخال البضائع التي جاءت إلى المتجر في جهاز كمبيوتر. بعد أن عملت قليلاً في المتجر ، كتبت برنامجًا يحلل قاعدة بيانات المنتجات في المتجر ويبحث عن المشكلات المحتملة. بعد ذلك ، عرضت الشركة التي تملك المتجر نقلها إليهم كمبرمج ، ولكن عندما اكتشفوا أنه لم يكن لديّ تعليم عالي ، فقد غيروا رأيهم. ومكثت في العمل في المتجر. لم يكن راتبي سيئًا ، لكن الدخل من المحتالين كان متواضعًا جدًا. كانت الدخول منخفضة لأن تسجيل الحسابات استغرق الكثير من الوقت ، وفي بيلاروسيا كان من الصعب للغاية العمل بأموال الإنترنت. Liberty Reserve - أموال الإنترنت ، التي تم توفير أعمالها من قبل أحد البنوك في كوستاريكا ، والتي لم تقدم معلومات عن عملائها إلى الحكومة ، ولهذا السبب استخدم معظم المحتالين Liberty Reserve.

كان من الصعب بشكل خاص شراء هذه الأموال في بيلاروسيا ، لأنه في المبادلات التلقائية كان عليك أن تدفع أكثر سبع مرات (إذا كانت الذاكرة تعمل) ، وكان الشراء من الناس عملاً محفوفًا بالمخاطر. توقفت عن خداع المحتالين وحصلت على دخل ، فقط من العمل. بعد العمل لمدة عام ، قررت أن أبحث عن شيء أفضل. كان لدي قدر كبير من المال في متناول اليد وقررت ترقية جهاز الكمبيوتر الخاص بي. ميزات الكمبيوتر الجديد: AMD Athlon 64 x2 2600 (مع دعم لتعليمات SSE2 التي لم تكن موجودة في المعالج السابق. هذا مهم!) ، 1 جيجابايت من ذاكرة الوصول العشوائي ، محرك أقراص ثابت 80 جيجابايت. تذكر أنني كنت أرغب في تعلم Kubuntu ولكن كان لدي قرص صلب صغير جدًا ، فقد قررت تثبيت نظامي Linux و Windows في نفس الوقت ، حيث لم أواجه أية مشكلات مع محرك الأقراص. عندما ذهبت إلى متجر محركات الكمبيوتر ، اشتريت محرك أقراص openSUSE 10.2. كانت وظيفتي الجديدة إصلاح أجهزة الكمبيوتر في إحدى الشركات في مدينتي ، مع فترة تجريبية مدتها شهر واحد. كان رئيس هذه الشركة ، وكذلك زوجته ، يطوران نوعًا من برامج المحاسبة ، متعلمين أنني كنت مولعًا بالبرمجة ، وعرضوا الانضمام للحصول على نسبة مئوية من المبيعات المستقبلية ، لكن بما أنهم كانوا يتطورون في Visual FoxPro و SQL ، فقد كنت بحاجة لتعلم هذه اللغات. أنا موافق بعد شهر ، اتضح أنهم لن يوظفوني ، لكنهم احتاجوا لي لاستبدال الموظف الذي ذهب في إجازة عندما عاد ، وقالوا إنهم لم يعدوا بحاجة إلي ، لكنهم ما زالوا يريدون مني مساعدتهم. مع التطور ، بالطبع رفضت وبدأت أبحث عن وظيفة جديدة. أدت عدة أشهر من عمليات البحث غير الناجحة إلى حقيقة أنني ذهبت إلى موقع البناء كعمال مساعدين.

كان راتب العامل المساعد أقل 3.5 مرة من أجر مشغل الكمبيوتر في المتجر ، لكن يجب أن أقول أن العمل أسهل بكثير (كنت شابًا قويًا). خلال عطلة نهاية الأسبوع ، باستخدام FASM ، بدأت في تعلم هذه التعليمات الجديدة SSE2 بالنسبة لي. بعد أن جربت ذلك ، أدركت أنه في بعض المهام ، يمكن أن تزيد هذه التعليمات من الإنتاجية بشكل كبير. كنت أتساءل كيف قام مطورو البرامج بتضمين تعليمات SSE2 في تطبيقاتهم ، لأنه إذا تم حل جميع المهام التي من المنطقي فيها استخدام SSE2 باستخدامها ، فلن يعمل البرنامج على أجهزة الكمبيوتر بدون دعم SSE2 ، لكن إذا لم تستخدمها ، فعندئذٍ البرنامج سوف تعمل أبطأ. بالطبع ، يمكنك معرفة ما إذا كان المعالج يدعم SSE2 في بداية البرنامج ، ووفقًا للنتيجة ، يمكنك تنفيذ تعليمات برمجية مختلفة ، ولكن في هذه الحالة يزداد تعقيد التطوير والاختبار ، بالإضافة إلى زيادة استهلاك ذاكرة الوصول العشوائي وذاكرة التخزين المؤقت للمعالج. بعد تحليل العديد من البرامج ، رأيت أن معظم البرامج لا تستخدم SSE2. ثم سألت نفسي: "لماذا لا يقوم المترجمون بترجمة وحدات الماكرو إلى مجمّع ، وعلى جهاز الكمبيوتر الخاص بالمستخدم النهائي ، لن تملأ بعض الأدوات المساعدة الثوابت اللازمة لوحدات الماكرو وفقط بعد أن يتم إنشاء ثنائي؟". وأنا أتذكر باسكال المعدلة التي اخترعتها في مدرسة ليسيوم ، قررت أن أكتب مترجمًا. لقد اتخذت أيضًا قرارًا بإضافة الأدوية العامة إلى اللغة وبدأت اللغة في أن تبدو مثل هذا:

type Point(a){
    x, y: a;
}

type Line(a){
    a, b: Point(a);
}

function createLine(a, b: Point(a)) Line(a){
    result.a = a;
    result.b = b;
}

Windows Linux( Windows, Linux ). Ubuntu 8.10, . , Gentoo. Gentoo use- , . , , , , . , - LLVM, LLVM IR. , , FASM, LLVM IR, , , , LLVM , , . . LLVM IR , , , , , . , , LLVM IR, , , . :

function inc(a: ^Integer) Integer{
    result = a^ + 1;
}

procedure foo(){
    var
        a: ^Integer;
        b: Integer;
    ...
    // 
    ...
    b = inc(ro nocp a) //   inc       ,     
}

, (800 $/), . , Haskell, : « », « », , - , . . Haskell . , — , , , — , , , ( , ) — , , , — , . « Haskell ». , . , . , , Haskell, - , . Haskell , Haskell( Python), .

, . Haskell . - Junior Haskell Developer , . . , , IDE, firefox + google , . . Haskell .

, Haskell , , , Haskell , , Haskell — ! Haskell , , ( Haskell). :

function lineLength(line: Line) Real
    result = sqrt(sqr(line.a.x - line.b.x) + sqr(line.a.y - line.b.y))

- 800$ 400$, 120$ + + 250$. 250$, ? . , — , , . 35$ . , , , . , , , , , - . 2 . , - . , , , , , « , . » — . , , , (14 ). , , , , , , . , ( ), , , , 1-2 . . , , , 3 , . , 3 . , . ( ).

: , , , . ( ), , , , . , , , , , ( ). , . , - (, , , ), , - , . ( , , ), 60% . , , , . , , :

  1. , ( ).
  2. , LLVM IR . , A m, , LLVM IR , B A, m LLVM IR .
  3. .
  4. .

, . , :

  • Haskell?

    , , . :

    abstract class Printable
    
    require method (Printable) print()
    method (Printable) printLn()
        this.print()
        String.eol().print()
    

  • ?

    , , , . :

    class Some(SomeParent)
        a, b String
    
    class Some(Some, Printable)
    
    override method (Some) print()
        this.a.print()
        this.b.print()
    

  • ?

    ( 2 , — ).
  • , ?

    , . . :

    method (Some) foo(a :String, b String) // a -  , b - 
        c := 10 // c  
        d .= 12 // d  
        :someMethod() //   someMethod, c    
        c.someMethod() //   someMethod, c    
        //2  ,     ,    ,     
    

  • ?

    , . :

    class Point
        x,y Number
    
    method (Some) foo(a Point<x UInt64, y UInt64>) // a   ,     Point,      x  y.    ,     .
    
  • , Point x y .

    class Point
        x, y !Number //   x  ,  y   x
    

  • ?

    , , . :

    class Point
        numberClass #Number
        private x, y .numberClass
    
    method (Point) createPoint(x, y .numberClass) This //This -           
        result:x = x
        result:y = y
    

  • , LLVM IR ?

    ( ) , . :

    method (Some) foo(a .z, b Point<numberClass .f>, c UInt64)
    //a      z     
    //b       Point      numberClass,           f     
    //c    UInt64,     
    

  • ?

    , , , - , , . 0 — .

, . . , , , , , , . , , , — , . - 5 . , . : . — 170 $/. , , , , . , , .

, , , . , O0 O2, O1 O3. , LLVM IR, . LLVM IR, , clang C. - , C LLVM IR , LLVM IR. LLVM IR? .

C LLVM IR? LLVM IR C: , , , C . LLVM IR C. , . , , , . , this 2 ( ) 4. , , 20 — 40 ( ). , , . , 2 , , , , , , . , , — . , . , .

, :

  • , .
  • , .

— « , ?». , , , , . , this ( ). :

method (#Some) foo(a String, b `String, c ~String, d :String)
//this  
//a   
// b    ,         
//c        ,        
//d  ,  

. , , , ( ) , , , ( ) : , , , , this ( , ), , , , . , :

method (~Some) veryBadMethod(value This)
 this = value

method (#Some) foo()
    a := Some
    b .= Some#randomValue() //,    b    
    a~veryBadMethod(b)
    a:someMethod() //  ,   

, . , , . , , , . — 2 , , , , , — .

, , . , «! ! .». , . — . , , 150-180. 11 . , , , - , . (? , ). , . , , 30- , , , 200$ ( ), , , .

, . (Disciples 3) — , , — « !». , , , ? , ! , , . , « ? Haskell.». 10 , , , , , . -, , ( , ) , , .

, . , , . , , , , , .

, , , , , , . . . , , . :

type Point(a)
    x,y a

type SimplePoint
    x,y Double

//-  
a := Point(UInt64)

Haskell, , , , . , - . . :

group Equal
//equal(a, a) -> Bool

, Equal, equal, 2 , Bool.

(rules) — , . . :

rules
    1 = type == [_] //    
    2 = type[0] > Equal //      Equal
    3 = 1 & 2
    join 3 Equal //      Equal

. , , , , — . , 1 9 ( 5), , , , . :

func notEqual(a, b)
    rules
        final = a > Equal & a == b
        result = Bool
    result = !(a == b) //!  ==  ,    result = (neg(equal(a, b))  a.equal(b).neg()

, , , , . , , , , , . , bash , . ( ) .

, : cine, , fei. github:

cine fei.
.
.
( ).
XML Kate.

Linux x86_64( ) clang.

, , cine.

:

  • cine fei n-kine enfei.
  • cine C.
  • cine ( ).
  • 4ernika, , .
  • , , . size count , size count, . , , , .
  • , ( ).
  • , , ( , ). , , . .
  • cine , cine — UInt8, , .
  • LLVM IR C, clang GCC. , , , clang.
  • SIMD , 0.1 SIMD ( ), , SIMD .

Source: https://habr.com/ru/post/ar481276/


All Articles