• 0
مصطفى 36a2

تعلم لغة برمجية في عشر دقائق ..

سؤال

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

في الحقيقة أحاول حالياً إثبات فكرة أن لغات البرمجة هي مجرد أساليب متكافئة لإعطاء الأوامر للحاسوب ..

وكمثال على ذلك .. لو كان لدينا لغة برمجة طريقة التفكير بها بسيطة جداً ... مجرد 8 أوامر فقط .. واستطعنا إيجاد المكافئ لها في لغة أخرى ...
ماذا يبقى لدينا؟؟
يبقى أن نفكر بطريقة معينة عن طريق الأوامر الموجودة لدينا ...
مثلا تتيح لنا php إنتاج كود Html ... صحيح أن C++ لم تصمم لهذا الغرض ولكن بمجموعة أكواد مكافئة لأكواد الphp قد نستطيع كتابة كود php كما هو داخل مترجم C++ ..
كما طرح مرة الأخ حمزة عن كتابة كود باسكال ينفذه مترجم الC++ بشكل نظامي....
كود الباسكال :

programbeginwriteln("Iam Hamza\n");end

بإضافة الأسطر التالية سيعمل كما لو أنه في بيئته الأصلية :


#include <stdio.h>#define program main()#define begin {#define writeln(x) printf(x)#define end } 

حسناً لندخل الآن في صلب موضوعنا :
لو قلت ان لدي مصفوفة:

char array[30000]={0};

ولدي مؤشر:


char *ptr=array;

وأضمنت مكتبة واحدة من مكاتب الC وهي :


#include<cstdio>

إذا قلت لك مسموح لك استخدام التعليمات البرمجية التالية فقط :


 	++ptr; 	--ptr; 	++*ptr; 	--*ptr; 	putchar(*ptr); 	*ptr=getchar(); 	while (*ptr) {	}

(كل سطر فيه تعليمة .. والقوس الأخير تعليمة مستقلة)
فإذا علمت أن قيمة عناصر المصفوفة جميعا 0.
_____________________________________________انتهى الفرض____________________________________

هل يمكنك كتابة برنامج .. يطبع Welcome باستخدام ما سبق فقط ...

______________________________________________انتهى الطلب___________________________________

إذا تمكنت من التفكير بهذه الطريقة ... تكون قد أنهيت تعلم لغة برمجية اسمها .. Brainf**k
حيث يمكنك بعد الانتهاء من كتابة برنامجك استبدال التعليمات البرمجية كما يلي :

> 	++ptr;< 	--ptr;+ 	++*ptr;- 	--*ptr;. 	putchar(*ptr);, 	*ptr=getchar();[ 	while (*ptr) {] 	}

ويتم انشاء المصفوفة والمؤشر آلياً عند بدء البرنامج ..
وعندها سيصبح كودك مكتوباً بلغة Brainf**k

لاحظ أن اللغة كائنية التوجّه ...... عفواً .. مجرد مزحة ثقيلة ...

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

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

إن أردت رأيي باسم اللغة ... فيبدو أن مخترعها Urban Müller والذي اخترعها على سبيل التسلية لا أكثر .. كان من التشائم بمكان بحيث نسي كلمة Shine من قاموسه عند تسمية اللغة..
وبرأيي يجب أن يكون اسمها BrainShine أي إشراق العقل ...للمزيد عن اللغة
Wikipedia وهذه المقالة القصيرة ..

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

في النهاية .. ليس المهم أن تتعلم الكثير .. المهم أن تعرف حدود ما تعلّمته... قد يمكّنك من الوصول إلى أبعد مما تتصور بكثير ...


والحمد لله رب العالمين

تم تعديل بواسطه مصطفى 36a2
ازالة عمى الالوان
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

10 إجابة على هذا السؤال .

  • 0

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

المقالة مترجمة عن المقالة الاضلية

تم تعديل بواسطه محمد عودة
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لم الجميع في عجلة من أمرهم ؟ :P

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخي الكريم : لغة البرمجة المطروحة ليست لغة مستقلة بذاتها ...

بمعنى أنه كونك مبرمج بلغة ++C فهذا يعني أنك قادر من خلال تغيير طريقة تفكيرك فقط على تعلم هذه اللغة ...

ألا يمكنك تعلم تغيير طريقة تفكيرك في عشر دقائق ..؟؟ ربما يمكنك ذلك في دقيقة واحدة...

تمنيت لو أن التعليقات على المحتوى .. وليست على العنوان ... رغم أنني لم أبالغ في العنوان وقد بينت السبب ...

تم تعديل بواسطه مصطفى 36a2
ازالة عمى الألوان
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

حسنا, لنناقش الفكرة معا .. لكن وسع صدرك :)

لغة البرمجة مجرد طريقة تفكير ...

أظنك أخذتَ هذه الجملة من المقولة المشهورة للعالم Alan Perlis :

A language that doesn't affect the way you think about programming, is not worth knowing.

صحيح ؟ :)

لغة البرمجة المطروحة ليست لغة مستقلة بذاتها ...

ليست مستقلة بذاتها و ليست أيضا "لغة برمجة" !

لو كان استخدام الــ Macro يمكننا من توليد لغات برمجة جديدة لما احتاجت Microsoft إلى كتابة لغة عملاقة كــ C# لتنافس الــ Java و نظيراتها !!

بمعنى أنه كونك مبرمج بلغة ++C فهذا يعني أنك قادر من خلال تغيير طريقة تفكيرك فقط على تعلم هذه اللغة ...

الأمر أكثر تعقيدا مما تتصور !, بناء لغة برمجة (حتى يستطيع القارئ تعلمها في 10 دقائق) يحتاج إلى إتقان علم الـمترجمات بما في ذلك :

  • Lexical Analyzer
  • Syntax & Semantic Analyzer
  • Code Generator
  • Code Optimzer

أما إن كنت تفكر في لغة برمجة عربية فستحتاج إلى كتابة مجمع (assembler) يقوم بتحول النص العربي (الاوامر وغيرها) الى اوامر اسمبلي عن طريق تخطيط يربط بين الاوامر العربية وتعليمات الاسمبلي الانكليزية (hash table).

كملاحظة أخيرة : أرى أن كثرة الألوان في مشاركتك تُربك القارئ و قد تصيبه أيضا بعمى الألوان :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أشكرك جزيل الشكر أخي خالد على الرد ...

لكن وسع صدرك

على الرحب والسعة ..

أظنك أخذتَ هذه الجملة من المقولة المشهورة للعالم Alan Perlis :

A language that doesn't affect the way you think about programming, is not worth knowing.

صحيح ؟ :)

أنا مسرور لأنك أخبرتني بذلك فهذا يعني أن ما أؤمن به صحيح ..smile.gif

ليست مستقلة بذاتها و ليست أيضا "لغة برمجة" !

للأسف إنها لغة برمجة معترف بها..ما باليد حيلة ...sleep.gif

الأمر أكثر تعقيدا مما تتصور !, بناء لغة برمجة (حتى يستطيع القارئ تعلمها في 10 دقائق) يحتاج إلى إتقان علم الـمترجمات بما في ذلك

عرفت أين المشكلة ... كان يجب أن أذكر من البداية أنني لست مخترع اللغة ... حتى تلقى أقل قدر من الاحترام ..

يا أخي والله لست أنا من اخترع اللغة ... وهي لها كومبايلر مستقل وحجمه 256 بايت ...

كملاحظة أخيرة : أرى أن كثرة الألوان في مشاركتك تُربك القارئ و قد تصيبه أيضا بعمى الألوان

أعتذر بشدة على ذلك ... سأعالج هذه المسألة في المرات القادمة إن شاء الله تعالى ...

.. وشكراً جزيلا لردك ...

والسلام عليكم

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

تحياتي العطرة ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أستاذي الفاضل سنان محمد صالح مرورك يعني لي الكثير ...ولكن ..

Peter Norvig

Why is everyone in such a rush?


من الممكن ان تختصر مقالتك كلها بالتعبير عن شئ واحد ، الا وهو التفكير البرمجي

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

التشبيه بين لغة باسكال ولغة سي++ اوسي شارب ، من باب التفكير البرمجي يعتبر نوعا ما خطأ او من الجانب الخاطئ للمقارنة

طالما نحن متفقون على أن التفكير البرمجي هو اللب وأن دراسة الخوارزمية هو الأساس ...
ألا يمكن بناء مترجم من لغة إلى أخرى ...؟؟



ولذلك الافضل الكتابة عن بنية حل المشاكل وطريفة التوصل الى حلول نموذجية ، ومقارنة هذا الحل مع حل اخر

لك ذلك .. وكما تريد بالضبط ... كنت أنتظر أن يقول أحدهم هذا الكلام ... smile.gif

هذا البرنامج يقوم بإدخال الأرقام .. حتى إدخال الرقم 42 ... كلام بسيط جداً ...



include <iostream>using namespace std; int main() {         int intNum = 0;                cin >> intNum;        while (intNum != 42) {                cout << intNum << "\n";                cin >> intNum;        }         return 0; }

والأن إليكم الكود نفسه تماماً ... بلغة BrainF**K (أعتذر على شناعة الاسم ولكنها لغة فريدة بكل شيء حتى الاسم)


>+[>>,----------[>,----------]+++++[<-------->-]<[>>-<]>+[-<+++++++[<------>-]<[>>-<]>+[-<<[>>-<]>+[<<->>->]>]<+++++++[<++++++>-]>>]<++++++++[<+++++>-]<[<]<[>>[++++++++++.>]++++++++++.[[-]<]]<]

أظن أن الكود مفهوم ولا يحتاج إلى شرح ..wink.gif
.....................
ما يهمنا عملياً .. طبعاً ليس طول الكود أو درجة تعقيده ... ولكن المعلومات التالية :
يستهلك الكود السابق عند التنفيذ ..1664kb من الذاكرة أي حوالي 1.5 Mb
أما كود ال++C فيستهلك 2684kb أي حوالي 2.6 Mb
يستغرق كود ال++C ضعف الزمن الذي تستغرقه اللغة الأولى ...
عدا عن أن كومبايلر ال++C حجمه 65536 kb بينما حجم كومبايلر لغتنا الجديدة 256 بايت ...


بما أن التعليمات الثماني بسيطة جداً ... وكذلك انشاء المصفوفة وحجز المؤشر ..
هذه التعليمات تكافأ تماماً بلغة الأسمبلي (بعد استثناء تابعي الدخل والخرج) بأربع تعليمات فقط.. وهي Inc Dec Mov loop

وعلى حد معرفتي بالأسمبلي فهناك تعليمتا In out ولكن لا أعرف استخدامهما ...

حسناً ...المهم الآن وبعد معرفة حدود وبساطة اللغة الهائل ....

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


أنتظر رأيكم ...الجاد هذه المرّة ...

 

تحياتي العطرة ..

 

 

كل ردك كان كذلك ...


والسلام عليكم ورحمة الله وبركاته

 

تم تعديل بواسطه مصطفى 36a2
ازالة الالوان
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

من الجدير بالذكر .. أنه لو استعملنا في ++Cنفس طريقة الBrainf**k

فسيكون الكود كما يلي :

#include<cstdio>
using namespace std;
int main()
{
char array[30000]={0};
char*ptr=array;
++*ptr;++*ptr;ptr;++*ptr;while(*ptr){++*ptr;++*ptr;ptr;++*ptr;++*ptr;ptr;*ptr=getchar();--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;while(*ptr){++*ptr;++*ptr;ptr;*ptr=getchar();--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;}++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;while(*ptr){--*ptr;--*ptr;ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;++*ptr;++*ptr;ptr;--*ptr;}--*ptr;--*ptr;ptr;while(*ptr){++*ptr;++*ptr;ptr;++*ptr;++*ptr;ptr;--*ptr;--*ptr;--*ptr;ptr;}++*ptr;++*ptr;ptr;++*ptr;while(*ptr){
--*ptr;--*ptr;--*ptr;ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;while(*ptr){--*ptr;--*ptr;ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;--*ptr;++*ptr;++*ptr;ptr;--*ptr;}--*ptr;--*ptr;ptr;while(*ptr){++*ptr;++*ptr;ptr;++*ptr;++*ptr;ptr;--*ptr;--*ptr;--*ptr;ptr;}++*ptr;++*ptr;ptr;++*ptr;while(*ptr){
--*ptr;--*ptr;--*ptr;ptr;--*ptr;--*ptr;ptr;while(*ptr){++*ptr;++*ptr;ptr;++*ptr;++*ptr;ptr;--*ptr;--*ptr;--*ptr;ptr;}++*ptr;++*ptr;ptr;++*ptr;while(*ptr){--*ptr;--*ptr;ptr;--*ptr;--*ptr;ptr;--*ptr;++*ptr;++*ptr;ptr;++*ptr;++*ptr;ptr;--*ptr;++*ptr;++*ptr;ptr;}++*ptr;++*ptr;ptr;
}--*ptr;--*ptr;ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;while(*ptr){--*ptr;--*ptr;ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;ptr;--*ptr;}++*ptr;++*ptr;ptr;++*ptr;++*ptr;ptr;
}--*ptr;--*ptr;ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;while(*ptr){--*ptr;--*ptr;ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;ptr;--*ptr;}--*ptr;--*ptr;ptr;
while(*ptr){--*ptr;--*ptr;ptr;}--*ptr;--*ptr;ptr;while(*ptr){++*ptr;++*ptr;ptr;++*ptr;++*ptr;ptr;while(*ptr){++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;putchar(*ptr);++*ptr;++*ptr;ptr;}++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;putchar(*ptr);while(*ptr){while(*ptr){--*ptr;}--*ptr;--*ptr;ptr;}}--*ptr;--*ptr;ptr;}
return 0;
}

وسيستغرق مئات أضعاف الوقت الذي ستستغرقه BF للقيام بذلك ...

وجب التنويه لذلك ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ما يهمنا عملياً .. طبعاً ليس طول الكود أو درجة تعقيده ... ولكن المعلومات التالية :

يستهلك الكود السابق عند التنفيذ ..1664kb من الذاكرة أي حوالي 1.5 Mb

أما كود ال++C فيستهلك 2684kb أي حوالي 2.6 Mb

يستغرق كود ال++C ضعف الزمن الذي تستغرقه اللغة الأولى ...

عدا عن أن كومبايلر ال++C حجمه 65536 kb بينما حجم كومبايلر لغتنا الجديدة 256 بايت ...

السي++ هي أسرع اللغات البرمجة العالية المستوى (و هذا أمر لا يختلف عليه اثنان), أما لغة الــ BF فأعتقد أنها لغة "بشعة" و غير قابلة للقراءة. (مجرد وجهة نظر)

على ذكر اللغات البرمجية البشعة, خذ عندك لغة الــ Whitespace كمثال. هذا برنامج مكتوب بها و يطبع hello word :

| | | |
| | | | | | | | | | |
| | | | | | | |
| | | | | | | | | | |
| | | | | | | | |
| | | | | | | | | | |
| | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | | |
| | | | |
| | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | |
| | | |
| | | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | | |
| | | | | | | |
| | | | | | | | | | |
| | | | | | | |
| | | | | | | | | | |
| | | | |
| |
| | | | | | |
empty-line
| | | | | |
empty-line
| | | | | |
empty-line
| | | | | |
| |
| | | | | | |
| | | | |
empty-line
| | | |
empty-line
| | | | | |
empty-line
empty-line/EOF

تحياتي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
السي++ هي أسرع اللغات البرمجة العالية المستوى (و هذا أمر لا يختلف عليه اثنان)

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

لغة الــ BF فأعتقد أنها لغة "بشعة" و غير قابلة للقراءة

هل تظن أن عندي رأي مختلفlaugh.gif... أنا لم أقل أنها جميلة أو رائعة ... قلت أنها فريدة.. UNIQE وهي كذلك بالفعل...

على ذكر اللغات البرمجية البشعة, خذ عندك لغة الــ Whitespace كمثال. هذا برنامج مكتوب بها و يطبع hello word

أحب طريقتك في تبادل المشاعر مع لغات البرمجة ... لكن أظن أن WhiteSpace تحبك .. لماذا تكرههاhappy.giflaugh.gif

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

بالنسبة لHello World إليك جميع لغات العالم المسجلة :

HelloWorld

إذا أردت رأيي في اللغة الأجمل فهي LOLCODE :


HAI
CAN HAS STDIO?
VISIBLE "HAI WURLD!"
KTHXBYE

آخر سطر يُقرأ : Ok Thanks bye

انظر إلى هذا الإبداع

Super NAND Time!! Hello World Example

:

12 (32 35 37 38 42)
13 (35 37 38 39 43)
14 ((31 36 39 42 43))
15 (31 33 34 35 38 40 43)
16 (37 39)
17 ((31 43))
18 ((36 42 43))
20 ((42(43)))
21 44
31 ((31)(44))
32 (32(31))
33 (33(32))
34 (34(33))
35 (35(34))
36 (36(35))
37 (37(36))
38 (38(37))
39 (39(38))
40 (40(39))
41 (41(40))
42 (42(41))
43 (43(42))
44 1

كما قلت لك أخي العزيز ... لم لا ندلي بدلونا في هذا البحر الواسع ... ؟؟

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .