تيكو (محرر نصوص)

تيكو (محرر نصوص)
، والذي هو تسمية مختصرة في الأصل لمسمى محرر ومصحح الشريط (ورق)، لكن بعد ذلك أصبح محرر ومصحح النصوص، هو محرر نصوص الذي تم تطويره في الأصل في معهد ماساتشوستس للتقنية في الستينات، وبعد ذلك تم تعديله فقط من كل جهة. ومع كل اللهجات المندرجة، فربما كان TECO المحرر الأشهر من حيث الاستخدام قبل محرر في آي (والذي تم إدراجه لاحقا مع العديد من نظام تشغيل)، وقبل محررإيماكس، والذي يعتبر TECO سلفا له (فقد بدأ إيماكس تحرير ماكر بالتشغيل على نظام TECO).
الوصف والتأثير
TECO ليس مجرد محرر، بل هو مفسر لغة برمجة لمعالجة النصوص. والبرامج المتعاقبة (والتي تسمى macros) الخاصة بالبحث عن النص وتعديله تعطيه قوة كبيرة. ومع هذا، وعلى عكس تعابير نمطية، فقد كانت اللغة هي البرمجة الأمرية (في بعض النسخ كان يوجد مشغل «أو» في بحث السلسلة).
وليس لمحرر TECO علم النحو في الحقيقة، بل كل حرف في البرنامج له أمر إلزامي، يتم إرساله إلي الروتين المناظر له. وذلك الروتين ربما يقرا حروفا أخرى من دفق البرنامج (معطيا تأثير وسيطات السلسلة)، ويغير موقع «عداد البرنامج» (معطيا تأثير بنية التحكم)، أو يدفع القيم إلي تكدس القيمة (معطيا تأثير الأقواس المتداخلة). لكن لا يوجد ما يمنع عمليات مثل القفز إلي منتصف تعليق، لأنه لا يوجد نحو أو تحليل نحوي.
ولقد اقترح مقال كلاسيكي عن برمجة الحاسب بعنوان «برمجيين حقيقيين لا يستخدمون لغة باسكال» أن اللعبة المعروفة لجمهور TECO كانت هي إدخال اسمهم كتسلسل أوامر، وبعد ذلك يحاولون استنباط ما كان سيحدث. ونفس المقال قد استحدث – عند وصفه لمحرر TECO- اسم تاجي " "YAFIY، والذي يعني «أنت طلبته وقد حصلت عليه» وبالتالي فهو مضاد ما تراه هو ما تحصل عليه WYSIWYG.
ومحرر إيماكس الشهير للعالم ريتشارد ستولمن قد تم تنفيذه في الأصل في TECO (نسخ لاحقة من محرر ايماكس، أولا مولتكس ايماكس ثم جنو ايماكس، قد تم تنفيذهما في ليسب و[ليسب ماكس]). وقد أصبح مشهورا عقب [شركة المعدات الرقمية Digital Equipment Corporation] وتنفيذ [معالج 6 للبيانات المبرمجة] للحاسوب المتوسط الذي تم تطويره في [مشروع ماك Project MAC] بمعهد ماساتشوستس للتقنية في عام 1964. وقد أظهر هذا التنفيذ النص المحرر بصريا على شاشة أنبوب الأشعة المهبطية، وتم استخدامه كمحرر تفاعلي متصل (ومع هذا، فلم يكن هذا هو أصله أو أسلوب الاستخدام المقصود في الأصل). والنسخ اللاحقة لمحرر TECO كانت قادرة على تشغيل وضع ملء الشاشة على عدد من المحطات الطرفية للفيديو في آر إس 232 لشركة المعدات الرقمية.
وكان TECO متوفرا للعديد من نظم التشغيل والحواسب، بما في ذلك حاسب [معالج البيانات المبرمجة PDP-1 ]، ونظام المشاركة الزمنية الغير متوافق (ITS) على الحاسب المتوسط ((DP-6 والحاسب المتوسط PDP-10، و[نظام TOPS-10] و[نظام TOPS-20] على حاسب [PDP-10]. وتم تزويد نسخة من محرر TECO بكل أنظمة تشغيل شركة المعدات الرقمية DEC، والنسخة المتاحة لنظام [RT11] كانت قادرة على تشغيل شاشة عرض رسومات 40 جيجابايت بينما النسخة المتاحة لنظام [RSTS/E] قد تم تنفيذها على أنها [نظام زمن تشغيلي run-time system] متعدد المستخدمين وكان من الممكن استخدامها كبيئة تشغيل كاملة للمستخدم، فلم يضطر المستخدم للخروج أبدا من TECO. وقد تم استخدام محرر المحطة الطرفية للفيديو TECO ماكرو بشكل شائع على نظم [المشاركة الزمنية المتعددة المستخدمين RSTS/E] و[VAX] مع محطات طرفية قادرة على التحكم المباشر في المؤشر (مثل [المحطة الطرفية VT52] والمحطة الطرفية للفيديو VT100]) من أجل توفير محرر مرئي ملء الشاشة مشابه في وظيفته لمحرر [إيماكس Emacs] المطور بشكل عصري.
وبعد أن اشترى هوليت-باكارد شركة [كومباك Compaq] (والذي اشترى شركة Digital Equipment Corporation)، فلا يزال يزود محرر TECO بنظام تشغيل نظام الذاكرة الافتراضية المفتوح.
وسليل نسخة DEC الموزعة على حاسب PDP-10 لا يزال متاحا على الإنترنت، مع العديد من التطبيقات الجزئية لبيئة إم إس-دوس مايكروسوفت ويندوز.
التاريخ
تم تطوير محرر TECO في البداية في معهد ماساتشوستس للتقنية حوالي عام 1963 عن طريق دانيال مورفي Daniel L. Murphy من أجل استخدامه على حواسب [PDP-1 ]، والتي تنتمي إلي أقسام مختلفة، موضوعة في المبنى رقم 26 في معهد ماساتشوستس للتقنية. وعلى هذه الآلات، اشتملت عملية التطوير العادية على استخدام [آلة طباعة Friden Flexowriter] لإعداد كود مصدري غير متصل على قطاع مستمر من شريط ورقي مثقب. فقد ثقب مبرمجو النظم الكبيرة لشركة أي بي إم [IBM mainframes] كود مصدري الخاص بهم على [بطاقات cards]، باستخدام [مثقاب key punches] والتي طبعت حروف [مصفوفة نقطية dot-matrix] يمكن لبشر قراءتها على قمة كل بطاقة في نفس الوقت الذي تثقب فيه كل حرف يمكن للآلة قراءته. وبالتالي استطاع مبرمجو أي بي إم أن يقرؤوا ويضعوا ويمحوا ويحركوا سطور الكود عن طريق معالجة البطاقات ماديا في وحدة الأشرطة. والشريط الورقي المثقب لم يقدم تلك الخصائص، والضرورة كانت أم التحرير المتصل.
وكان هناك محرر مبكر لحاسب PDP-1 يسمى [برنامج Expensive Typewriter]. ومن خلال كتابته عن طريق ستيفين دي بينر Stephen D. Piner، فقد كان أول محرر يمكن تخيله متوجه صوب السطر، مع افتقاره لقدرات البحث والاستبدال. وتم اختيار اسمه على أنه بوك مصغر للمحرر الضخم المبكر الذي يسمى [Colossal Typewriter]. وحتى في هذه الأيام، استطاع التحرير المتصل أن يوفر وقتا في دورة تصحيح الأخطاء. وهناك برنامج أخر كتبه [PDP-1 hackers] وهو [برنامج Expensive Desk Calculator]، على منوال مشابه.
والغرض الأصلي المذكور لمحرر TECO هو الاستفادة من الحاسب PDP-1. وكما هو متصور في الدليل، فبدلا من القيام بالتحرير بطريقة باهظة من خلال الجلوس عند لوحة طرفية للتحكم، فيمكن للمرء فحص النص الخطأ ببساطة وإعداد «شريط تصحيح» يصف عمليات التحرير التي ينبغي القيام بها في النص. ويمكن للشخص تغذية الشريط المصدر بكفاءة وشريط التصحيح في حاسب PDP-1 عبر قارئه عالي السرعة (200 حرف في الثانية). ومن خلال تشغيل TECO، فسوف يقوم بثقب شريط محرر بسرعته العالية (60 حرفا في الثانية) في الثقب. وبعد ذلك يمكن للشخص أن يستمر في التعبئة والتجميع بدون تضييع وقت في التحرير المتصل.
وبعد ذلك تم تحفيز عمليات البحث المعقدة للمحرر TECO من خلال الحقيقة التي تقول أن مطبوعات آلة الطباعة غير المتصلة لم تكن مرقمة بالسطر، وبالتالي احتاجت مواقع التحرير إلي أن تكون محددة من خلال السياق وليس من خلال رقم السطر. وقد تم إدراج العديد من المفاهيم الحلقية والشرطية (التي جعلت TECO آلة تورنغ) من أجل توفير قوة وصفية كافية لشريط التصحيح. وقد قلل النحو المحكم من عدد ضربات المفاتيح اللازمة لإعداد شريط التصحيح.
وكان شريط التصحيح هو برنامج، وقد تطلب تصحيحا مثل أي برنامج أخر. وكانت مخاطر البحث والاستبدال الشامل واضحة. ومن الناحية العملية، تم القيام بتحرير TECO متصلا تمام كما كان مع برنامج Expensive Typewriter (على الرغم من أن TECO كان محررا أكثر كمالا من Expensive Typewriter، وبالتالي كان التحرير أكثر كفاءة مع TECO). والنسخة الأصلية من حاسب PDP-1 لم تكن لها شاشة عرض. والطريقة الوحيدة لمراقبة حالة النص أثناء عملية التحرير كانت كتابة الأوامر التي يمكن أن تجعل النص (أو أجزاء منه) يكتب على طابعة العارضة.
وفي عام 1964، تم تنفيذ نسخة خاصة من TECO(TECO-6) على جهاز [PDP-6] بمعهد ماسيشوتس للتقنية. وقد دعمت تلك النسخة التحرير المرئي، أي استخدمت شاشة عرض توضح محتويات مخزن التحرير في الوقت الحقيقي، وتحديثه كلما تغير. ومن بين مبتكري TECO-6 كان [ريتشارد جرين بلات Richard Greenblatt] و[ستيوارت نيلسون Stewart Nelson].
وفي معهد ماسيشوتس للتقنية، استمر تطوير محرر TECO في خريف 1971. وقد نفذ Carl Mikkelsen طريقة تحرير في الوقت الحقيقي بناء على أوامر عارضة التحكم البيانية في TECO-6، لكنها تعمل مع شاشة عرض النص في حاسب [Datapoint-3300 CRT]. ومع هذا، فتنفيذ مخزن محررTECO كان غير كفء بشكل فظيع في معالجة وضع حرف واحد أو محو وظائف- فقد استهلك التحرير 100% من جهاز PDP-10. ومع دعم المبرمج [Richard Greenblatt ]، قام Carl في صيف 1972 بإعادة تنفيذ مخزن TECO وأعاد تشكيل الماكرو على أنه كود PDP-10 أصلي. ولأن إدخال طريقة الوقت الحقيقي من خلال كتابة <cont> يمين، فكان هذا معروفا بطريقة كنترول يمين. في نفس الوقت، أضاف Rici Liknaitski وحدات ماكرو لإدخال الوقت (<contl>]) والتي عملت عندما تمت قراءة سلسلة الأوامر وليس عند تنفيذها. وقد جعلت وحدات ماكرو زمن القراءة مخزن النص المساعد لمحرر TECO والتي تسمى مسجلات Q أكثر فائدة.وقد وسع Carl مكان اسم مسجل Q. فمع وحدات ماكرو وقت القراءة، ومكان الاسم الضخم لمسجل Q، وعمليات التخزين الفعالة، تم ضبط الوضع لربط كل مفتاح بوحدة ماكرو. وهذه الوحدات التحريرية قد تحولت إلي إيماكس.
مثال للجلسة
لدينا ملف يسمى hello.c مع المحتويات الآتية:
int main(int argc, char **argv)
{
printf("Hello world!\n");
return 0;
}
ويمكن للشخص استخدام جلسة TECO الآتية (مع ملاحظة أن الأمر هو "*" و"$" هو كيفية تأثير مفتاح الإفلات) لتغيير «أهلا» إلي «مع السلامة»:
*EBhello.c$$ Open file for read/write with backup
*P$$ Read in the first page
*SHello$0TT$$ Search for "Hello" and print the line
printf("Hello world!\n"); The line
*-5DIGoodbye$0TT$$ Delete "Hello", insert "Goodbye", and print the line
printf("Goodbye world!\n"); The updated line
*EX$$ Copy the remainder of the file and exit
كود المثال
لغة البرمجة
إن الغموض الخاص بلغة برمجة محرر TECO يوصف بشكل جيد في الجملة الآتية المقتبسة من [مبرمجون حقيقيون لا يستخدمون لغة باسكال Real Programmers Don't Use PASCAL]، من خطاب من ED Post إلي مجلة Datamation في يوليو 1983، صفحة 263-265:
«تمت ملاحظة أن سلسلة أوامر TECO تشبه إلي حد كبير ضوضاء خط البث أكثر من النص المقروء. ومن بين أحد الألعاب المسلية في اللعب بمحرر TECO هي كتابة اسمك كما في سطر الأمر ومحاولة تخمين ماذا سيفعل. تماما مثل كتابة أي خطأ محتمل بينما تتحدث مع TECO سوف يدمر برنامجك، أو حتى أسوأ – فربما يقوم بإدخال أخطاء غامضة وماكرة في الروتين الفرعي الذي تعمل فيه.»
وعلى الرغم من النحو الشاذ، فلغة أوامر TECO كانت قوية بدرجة هائلة، والاستخدامات لا تزال متاحة لكل من إم إس-دوسو يونكس.
فأوامر TECO هي حروف (تشمل حروف كنترول)، والأمر هو علامة نجميه واحدة:
*
ويظهر مفتاح الإفلات كعلامة دولار، يتم الضغط عليها بعد أن توضح نهاية الأمر الذي يتطلب متغير مستقل ويتم الضغط عليه مرتين لبدء تنفيذ الأمر الذي تم إدخاله:
*$$
أمثلة البرامج
المثالان الأولان يمثلان نوعاً من التبادل لمخزن النص الحالي، بناء على الحرف الأول من كل سطر، والمأخوذ من دليل مستخدم محرر TECO PDP-11. نسخة [اذهب إلي goto] وبرمجة مهيكلة تعرض الآن. ولاحظ أن محرر TECO يتجاهل [الحالة case] و[الفراغ الأبيض whitespace] (ما عدا [tab]، والذي هو أمر إدراج).
مثال 1
!START! j 0aua ! jump to beginning, load 1st char in register A !
!CONT! l 0aub ! load first char of next line in register B !
qa-qb"g xa k -l ga 1uz ' ! if A>B, switch lines and set flag in register Z !
qbua ! load B into A !
l z-."g -l @o/CONT/ ' ! loop back if another line in buffer !
qz"g 0uz @o/START/ ' ! repeat if a switch was made on last pass !
مثال 2
0uz ! clear repeat flag !
<j 0aua l ! load 1st char into register A !
<0aub ! load 1st char of next line into B !
qa-qb"g xa k -l ga -1uz ' ! if A>B, switch lines and set flag !
qbua ! load B into A !
l.-z;> ! loop back if another line in buffer !
qz;> ! repeat if a switch was made last pass !
مثال 3
هذا المثال هو مفسر للغة برمجة [Brainfuck] لمحرر TECO. فهو يعمل من خلال تنفيذ المخزن كبرنامج Brainfuck، ويوضح قدرات المحرر.
@^UB#@S/{^EQQ,/#@^UC#@S/,^EQQ}/@-1S/{/#@^UR#.U1ZJQZ\^SC.,.+-^SXQ-^SDQ1J#@^U9/[]-+<>.,/<@:-FD/^N^EG9/;>J30000<0@I/
/>ZJZUL30000J0U10U20U30U60U7@^U4/[]/@^U5#<@:S/^EG4/U7Q7;-AU3(Q3-91)"=%1|Q1"=.U6ZJ@i/{/Q2\@i/,/Q6\@i/}/Q6J0;'-1%1'
>#<@:S/[/UT.U210^T13^TQT;QT"NM5Q2J'>0UP30000J.US.UI<(0A-43)"=QPJ0AUTDQT+1@I//QIJ@O/end/'(0A-45)"=QPJ0AUTDQT-1@I//
QIJ@O/end/'(0A-60)"=QP-1UP@O/end/'(0A-62)"=QP+1UP@O/end/'(0A-46)"=-.+QPA^T(-.+QPA-10)"=13^T'@O/end/'(0A-44)"=^TUT
8^TQPJDQT@I//QIJ@O/end/'(0A-91)"=-.+QPA"=QI+1UZQLJMRMB\-1J.UI'@O/end/'(0A-93)"=-.+QPA"NQI+1UZQLJMRMC\-1J.UI'@O/en
d/'!end!QI+1UI(.-Z)"=.=@^a/END/^c^c'C>
المراجع
تاريخ البرمجيات
محررات نصوص