‏إظهار الرسائل ذات التسميات research. إظهار كافة الرسائل
‏إظهار الرسائل ذات التسميات research. إظهار كافة الرسائل

الخميس، 8 نوفمبر 2012

A notation for a sketch-based programming language

This is my design for a language called "SketchCode". The language tries to enable sketch-based programming, both on a traditional paper pad or on a tablet-like device, and strives to maintain simplicity and clarity of the sketches by reusing whatever notations people already use when sketching and by introducing as few new notations as possible.

Instead of making the code itself graphical, the system keeps the code mostly text based while using graphical notation for data structures. Blocks of simple shapes indicate objects, arrows indicate object references, tables indicate records or arrays.

As you see, this simple scheme already allows us to represent many kinds of data. In SketchCode our program should be mostly graphs, state machines, ...etc, I like the idea that a program's data stands out more than its code.  As Fred Brooks said: Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won't usually need your flowchart; it'll be obvious

The graphical nature of the data allows us to program by pattern matching as seen in a lot of functional languages. An important set of new notations would be the language of pattern matching: how to indicate matching a variable? How to match a part of an array or structure?



The first example shows how to calculate the sum the elements in a (sketched) linked list, the second shows how to extract data from a record, and the third shows the notation for 'if' statements.

Tentatively, I chose to underline an identifier in a pattern to indicate being a variable, and the "piece of a table" to indicate partial record matching. It would be interesting to see how to indicate other notations like a part of a graph or a slice of an array.

I have also borrowed some notations from math, and an implemented system could add traditional notations for things like roots, fractions, summation,...etc

A lot can be done with just those basic components: we could have unit tests with sketches of test input, or a "console" where we sketch function application to evaluate it, and more. From there, there is so much that could be added.

Of course, such a system needs to be implemented in order to find out whether this design is really sufficient to express interesting programs, and whether such expressions are actually natural to draw/understand, and how to e.g naturally modify an existing program.

الخميس، 10 أبريل 2008

لغات البرمجة و لصوص الأفكار

في منتديات البرمجة ترى الصراعات عن الأدوات المفضلة: ما هي افضل لغة برمجة,و ما هو اقوى نظام تشغيل, و ما إلى ذلك.
و حين يتطرق الأمر الي لغات البرمجة بالذات, يأتي دائما ذكر كيف ان Microsoft قامت بسرقة افكار ال Java ووضعتها في ال #C.
السؤال هو: ما المشكلة في هذا؟ هل هناك سبب حقيقي يجعل استفادة مايكروسوفت من الأفكار الموجودة في ال Java شيئا سيئا؟

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

ال#C قد اقتبست من ال Java في بداية الأمر, لكنها بعد ذلك اضافت الكثير الي عالم المبرمجين في سوق البرمجيات,بداية من ال automatic boxing مرورا بالمساعدة في نشر استخدام ال closures و وصولا الي الأفكار الكبيرة مثل ال LINQ. اذا كان ثمن هذا هو الأقتباس من ال Java في البداية فليكن.
ال Java نفسها مر عليها سنوات و لم نر فيها الجديد. هي تقريبا نفس اللغة منذ ظهرت في منتصف التسعينات. نعم تطورت الLibraries و الIDE's الي حد يفوق ال #C في احيان كثيرة, و لكن اللغة نفسها صارت اشبه بعائق في طريق المبرمج اكثر منها اداة يستخدمها.

و مع ذلك فإن ال Java كانت قوية و مبتكرة حين ظهرت في بدايتها, و كانت بمثابة نفحة من الهواء النقي بالنسبة للمبرمجين وقتها. اتدرون ماذا كانت Sun تفعل في تلك الفترة؟ كانوا يقتبسون!

نظر مبتكروا Java الي لغات كثيرة بينما كانوا يقومون بتصميم اللغة الجديدة, مثل ال C و Mesa و Smalltalk و Objective C .لم يكن هذا عيبا في حق Sun. بل ربما كان ضروريا.

كلمة "سرقة الأفكار" لا تُفهم بالمعنى الحرفي, فالذي ينظر للبرامج الأخرى و هو يصمم برنامجه اقرب الي الصحفي الذي يتابع الأخبار ليعرف اهتمامات المجتمع او المؤلف الذي يقرأ كتب التاريخ بحثا عن ملحمة يروي عنها. هذا اطلاع و تأمل اكثر منه سرقة.

هل معني هذا انه لا يوجد ابداع حقيقي, و ان كل ما يفعله المبتكرون هو الأخذ من بعضهم البعض؟
بالطبع لا, فهناك الكثير من اللغات و البرامج التي ظهرت بأمكانيات مستقلة بدون النظر الى غيرها, ولكن حتى هذه الأبداعات تتضاعف فائدتها وتظهر قوتها الحقيقية حين تختلط بإمكانات اللغات الأخرى.

ليس معني الأبداع الأنغلاق. بل كلما نظرت إلى اعمال غيرك صار لديك مورد اكبر لأفكارك. بل و يفيدك أيضا التأمل في العلوم غير البرمجية ولو كان مشروعك برمجيا. لهذا يدرس مصممي ال User Interface علم النفس. و لهذا يفتخر Larry Wall مخترع لغة ال PERL بأنه درس اللغات الطبيعية البشرية, و لولا هذا ما ظهرت لغة مثل ال LISP مبنية على الأسس الرياضية التي يضمها ال Lambda Calculus.

و بمناسبة أقتباس الأفكار, لعلك تقرأ في الصحف المصرية الكثير من النداءات لتشديد قوانين براءات الاختراع و أن هذا هو السبيل الوحيد للحاق بركب التقدم.
كلا لا اصدق هذا. العلم كله مبني على بعضه البعض, و لا ارى ان تقييد حرية الأستفادة من افكار الغير يؤدي حقا الى التطور. تخيل لو كانت هناك براءات اختراع على ال Hashtable او ال Linked List او خوارزمية ال Binary Search او أي من هذه الأساسيات.
كان هذا سيقيد حرية التطوير الى حد ساحق و ربما ماكان سيظهر لنا Windows ولا Linux ولا Java ولا #C !