لماذا صمدت سي بينما ماتت معظم اللغات القديمة ؟
هل ذلك لمجرد أن كمية ال legacy codebase المكتوب بها يصعب نقلها للغة أخرى أحدث ؟
بشكل أساسى لأنها قريبة جدا من لغة الألة, و يمكن بها التحكم بشكل شبه كامل فى الذاكرة و موارد الحاسوب, اضافة طبعا الى السرعة و الاداء.
السى كذلك رائعة فى مجال الmodular design.
تصميم السى كلغة تدعم عدد محدود من الSyntax القياسية التى تتحكم بمسار البرنامج و العمليات الحسابية, بينما كل شىء أخر (مثل الطباعة الى الشاشة, و جميع العمليات الاخراج و الادخال فى مكتبات خارجية) جعلها أفضل لغة لتعدد المنصات.
فمبجرد اعادة كتابة مكتبات سى القياسية (أو ترجمة نفس البرنامج) على مترجم خاص بنظام أخر, يمكن اعادة ترجمة نفس الاكواد لعدة منصات.
لا يوجد لغة أخرى يمكنها منافسة السى بأى شكل من الاشكال حاليا و لا تدع أحدا يخدعك, لربما الباسكال بشكل ما (لكن انتشارها على المنصات المختلفة أقل كثيرا) و الأسمبلى, لكن الأسمبلى بالطبع خارج برامج الmicrocontrollers شبه مستحيلة حاليا مع زيادة تعقيد و متطلبات البرامج حاليا.
السلام عليكم أخ فادي، مدة طويلة لم نرك فيها.
ما رأيك في لغة Go ولغة Rust والتي قُصد بها منافسة لغة سي++ من حيث إنتاج برامج Native.
بالنسبة للغة Go فيمكن إنتاج برامج تنفيذية لأي منصة من نظام التشغيل الذي تستخدمه، وهذه الميزة اسمها cross-compilation مثلاً وأنت في نظام وندوز يمكنك إنتاج ملف تنفيذي للبرنامج الذي تقوم بكتابته لعدة منصات بضغطة زر: إنتاج برامج لينكس من وندوز، وماك و راسبري باي، و BSD و Solaries و PowerPC. فهل هذه الميزة موجودة في لغة سي أو مترجمات سي بنفس السهولة؟
لكن لغة Go لديها نفس مشكلة مترجم الباسكال، حيث أن ملفها التنفيذي كبير جداً حيث يحتوي على كل الـ run-time الذي يحتاج إليه البرنامج بالإضافة ألى أن يقوم بعمل static-linking للمكتبات أو الحزم التي تستخدمها، لكن في المقابل لا يحتاج لأي مكتبة خارجية حتى تعمل البرنامج المكتوبة بلغة Go
تحياتى يا صديقى,
كنت منشغلا بعض الشىء.
بصراحة لا أعرف الكثير عن لغة Go او Rust,
كلاهما لغات حديثة نسبيا, أعتقد يجب تركهم بعض الوقت للنضوج!
Rust لغة شديدة الشبه بسى++, تقريبا نفس الشىء.
Go لغة من داخل جوجل, بعدما رأيت (من عمل زميل لى) سخافة و بطء منصة Android Studio من جوجل, فانا لست متفائلا بصراحة! عادة جوجل هى "لملمة" بضعة اكواد مفتوحة المصدر من هنا و هناك لا أحد يعرف كيف تعمل معا و عليك أنت ان تقضى اياما و ليالى فى بحور من الstack overflow و الupdates و الworkarounds و الconfig files!!
كل هذه الدورة تنتهى لتبدء مرة أخرى مع الابديت القادم!
لن أطور أى شىء يرتبط بجوجل ما حييت!
الcross compilation بهذه السهولة موجود فى Embarcadero C++ Builder, ( و دلفى كذلك), حيث يمكن استهداف منصات ويندوز 32, ويندوز 64, اندرويد, ماك او اس, و IOS بضغطة زر أيضا. (و من دلفى, يمكن انتاج برامج لينكس).
لكن فى الحقيقة, هذه ميزة لا طائل منها ما لم تمتلك debugger يعمل من خلال Virtual Machine كحالة الاندرويد, أو جهاز موصول للتجربة الحية.
المشكلة الاساسية أن اللغتين لم يحلوا المشكلة الاساسية مع سى/سى++.
و هى شكل الكود غير الانيق (باسكال!), و الreadability (باسكال, بيسك, COBOL!)
بالنسبة لنضوج اللغة فأول مرة سمعت عنها عندما تم إصدارها عام 2009 فتركتها تنضج إلى عام 2016 قمت بتجربتها ولم تعجبني بسبب أداة التطوير والمحرر الذي استخدمته مقارنة بأداة التطوير NetBeans.
لكن رجعت لتجربتها مرة أخرى في بداية 2017 بسبب حوار مع أحد مبرمجي فري باسكال، فقمت بتجربتها وبدأت بإنتاج برامج حقيقية بها لكن صغيرة استخدمتها في العمل ووجدت الفرق خصوصاً في اﻷداء مقارنة بجافا والمرونة والسهولة والمكتبة القياسية الغنية مقارنة بفري باسكال وبيئة لازاراس.
النُسخة اﻷولى من Andriod Studio مبنية على Eclipse، والنُسخة الثانية مبنية على IntellJ وكلاهما مبني على جافا، لذلك كان البطء في التنفيذ والاستهلاك الكبير للذاكرة. لكن مع لغة Go فهو مشروع بدأ بالكامل داخل قوقل ولم يعتمد على برنامج مفتوحة المصدر. بعد نجاحها بدأت قوقل باستخدامها داخليا في برامجهم الداخلية ومحرك البحث واليوتيوب و google download.
لا يمكن مقارنتها بأداة التطوير دلفي لأن لغة Go وكل أدواتها مجانية ومفتوحة المصدر فهذه ميزة مهمة لا تجعل دلفي يُنافسها في مجال العمل الحقيقي ومع الشركات التي تستخدم عدد كبير من المبرمجين.
بالنسبة للـ cross-compiler لا يحتاج إلى virtual debugger التجربة فقط تكون في المنصة التي تعمل عليها، وإذا كانت طريقة عملك صحيحة فإن الملف التنفيذي الذي ينتج يتطلب اختبار فقط وليس debugging في باقي المنصات.
هذا المثال لكود بلغة Go لعمل Reverse Proxy وجدته في شكل تويته في تويتر، بعنوان tweet-size proxy وقمت بتجربته وهو يعمل:
package main
import (
"io"
"net"
)
func main() {
s, _ := net.Listen("tcp", "localhost:9999") // Proxy port
for {
l, _ := s.Accept()
r, _ := net.Dial("tcp", "localhost:80") // Target
go io.Copy(l, r)
go io.Copy(r, l)
}
}
تتميز لغة Go بإمكاناتها الكبيرة وتسهيل برامج الشبكات مثل Socket programming, HTTP server, ssh, https, web socket، smtp, كلها موجودة في المكتبة القياسية، هذا مثال لخدمة ويب تعمل بدون الحاجة لمخدم ويب
// simplewebService project main.go
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type User struct {
Firstname string
Lastname string
Age int
}
func main() {
http.HandleFunc("/decode", decode)
http.HandleFunc("/encode", encode)
http.ListenAndServe(":9090", nil)
}
func decode(w http.ResponseWriter, r *http.Request) {
var user User
json.NewDecoder(r.Body).Decode(&user)
fmt.Fprintf(w, "%s %s is <b>%d</b> years old!", user.Firstname, user.Lastname, user.Age)
}
func encode(w http.ResponseWriter, r *http.Request) {
w.Header().Add("content-type", "application/json")
peter := User{
Firstname: "John",
Lastname: "Doe",
Age: 25,
}
json.NewEncoder(w).Encode(peter)
}
بالمناسبة أنا أيضاً لا أحب قوقل، موقع Golang مغلق عن السودان www.golang.org
سى++ لا أميل الى اعتبارها لغة أخرى,
فى النهاية هى لغة سى مع دعم البرمجة الكائنية,
لو تجنبت استخدام الكائنات و المكتبات الخاصة بلغة سى++, يمكنك أن تترجم برنامج سى بواسطة مترجم سى++,
فى النهاية اذا لم يحتاج التطبيق الذى تعمل عليه الى البرمجة الكائنية, فلا حاجة حقيقية لسى++, و تبقى سى وحدها أكثر خفة و بساطة.
فهمت أنك تقول ان c الأقوى من ناحية الاداء
اذا استخدمت c++ كونها توفر امكانيات اكبر هل يمكن ان يؤثر هذا على الاداء ؟
مع تحياتي
توجد مجالات عديدة لا تستطيع لغة سي المنافسة فيها أو بمعنى آخر خسرت المنافسة لصالح لغات أخرى، هذه المجالات مثل:
برامج الويب web applications حيث تشتهر فيها لغات مثل: Java, PHP, Python
خدمات الويب web services وتسيطر عليها لغات مثل: Java, Golang, Python
برامج الموبايل (أندرويد، IOS) لا يوجد نظام لهاتف ذكي معروف يستخدم لغة سي، بعض اﻷنظمة مثل نظام Ubuntu للهاتف لم ينجح أظنه يستخدم لغة سي
مجال الذكاء الاصنطاعي والـ deep learning حيث برزت فيها لغة بايثون
برامج المؤسسات العالية المستوى عموماً Business application مثل ERP, Business Process Management وغيرها من البرامج التي تتطلب لغة برمجة ذات إنتاجية عالية تستطيع بيوتات البرمجة أن تبني أنظمة بها تنافس في السوق في وقت وتكلفة وجيزين
هذا صحيح الى حد ما,
لكن لا تنسى أن خدمات ويب جوجل و فيسبوك بها جزء كبير مكتوب على لغة سى++ (يمكن اعتبارها سى!),
شخصيا استخدمت سى++ لكتابة خدمات الويب,
النتيجة ان الويب لدى عمل بشكل أسرع و استطعت تلقى عدد اكبر من الطلبات على سرفر متواضع الامكانيات, لكن الdebugging كان مؤلما بالطبع!!
الكثير من برامج موبايل IOS تكتب بلغة Objective C, و هى شكل من اشكال تطورات السى (مثل السى++)
بعض ألعاب الاندرويد تكتب بسى++ من أجل اداء أفضل.
الأهم من ذلك,
صحيح ان الweb services أو الweb applications لا تكتب عادة بلغة سى/سى++, لكن لا تنسى أبدا ان الويب نفسه يقوم على لغة سى/سى++,
المتصفح (كروم, فايرفوكس...) مكتوب على سى/سى++,
الWeb server أيضا سواء اباتشى, IIS, nginx مكتوب على سى/سى++,
برامج المؤسسات أيضا تقوم على أكتاف سى/سى++, فهى تعتمد بشكل كبير على الDatabase engine, و الذى هو غالبا مكتوب بسى/سى++, و ربما مكتبات للReporting و الخرج و كلها غالبا اكواد سى++
نعم معظم برامج سطح المكتب والمتصفحات وأنظمة التشغيل مكتوبة بلغة سي لأنه في ذلك الوقت لم تكن هُناك لغات منافسة، وعندما يصبح الكود المصدري لأحد هذه اﻷنظمة بملايين اﻷسطر فكيف يتم تغييره إلى لغة أفضل! اﻷفضل استمراره بنفس اللغة إلى أن تكون هناك الحاجة لعمل clean design عندها يمكن استخدام لغة جديدة
بالنسبة لـ Objective C فهي لغة قديمة ومعقدة، تم استبدالها بلغة Swift
أما بالنسبة لخدمات الويب فانظر كود لغة Go في تعليقي السابق وحاول كتابة ما يُناظرها بلغة سي أو سي++ لنستطيع مقارنة حجم الكود المكتوب ونقارنه من حيث المقروئية حتى لا يكون حكمنا نظرياً فقط.
لغة سي في نظري أصبحت بديل للغة أسمبلي لكنها سوف تخسر المعركة في البرامج عالية المستوى high level applications
بالنسبة للمبرمجين الجدد فسوف يميلون لاستخدام لغات أسهل وأكثر عملية إلى أن يتم استبدال جيل لغة البرمجة سي بجيل يعمل بلغات مختلفة أكثر إنتاجية
أنظر لتراجع لغة سي بين لغات البرمجة:
المتصفحات و غيرها من البرامج المعقدة تحتاج الى أفضل اداء ممكن و ادارة دقيقة للذاكرة و موارد الحاسوب,
و ليس هناك أى لغة تستطيع تقديم ذلك سوى السى,
لا أتخيل أن هناك من سوف يكتب html+javascript engine على سى# او جافا, هذا مستحيل!
معظم المتصفحات أساسا تستهلك الكثير من الموارد و هى مكتوبة على سى/سى++, فما بالك بهذه اللغات البطيئة.
فى الحقيقة لا أعرف الكثير عن لغة Go أو غيرها, لكن بشكل او أخر الكود الذى كتبته يمكن كتابته بواسطة سى مع تضمين كل الHTTP functions و الsocket فى مكتبات مرتبة جيدا (مثلا مكتبات Indy).
عموما, تم عمل clean design لمتصفح حديث نسبيا هو Microsoft Edge, و اعادة كتابة الengine بالكامل, و كتبت أيضا مرة اخرى على سى/سى++!!
و تم رميها و الانتقال الى chromium لكن هذا موضوع أخر.
الSwift هى تسهيل للObjective C و ليست بديل لها! مثلما الC# هى تسهيل للسى++ و ليس بديل لها!
اللطيف ان مايكروسوفت نفسها لا تستخدم سى# فى أى شىء ذو اهمية, و أبل لا تستخدم Swift فى اى شىء ذو اهمية, و جوجل لا تستخدم Go فى اى شىء critical.
هذه اللغات موجهه أساسا لمواقع الويب و برامج المؤسسات (المخازن, الحسابات, الخ).
لا أتخيل أن هناك من سوف يكتب html+javascript engine على سى# او جافا, هذا مستحيل!
لم أقل استخدام جافا أو دوت نت، مع أن هُناك مخدمات مكتوبة بجافا ومخدم مثل Apache Tomcat ، لكن أتكلم عن بدائل مثل Rust و لغة Go، إذا قرأت عن Firefox تجد أن تم إدخال لغة Rust المدعومة من مؤسسة Mozilla نفسها، وإذا كانت تكفيهم لغة سي لإنتاج المتصفح لما قاموا بإيجاد بديل لها وهي Rust:
فى الحقيقة لا أعرف الكثير عن لغة Go أو غيرها, لكن بشكل او أخر الكود الذى كتبته يمكن كتابته بواسطة سى مع تضمين كل الHTTP functions و الsocket فى مكتبات مرتبة جيدا (مثلا مكتبات Indy).
هذا الكلام يبقى نظري لا تستطيع برهانه عملياً، ربما يجتاج صفحات لكتابة نفس اﻷسطر التي تحتاجها لغة Go لكتابة برنامج خدمة ويب أو Proxy، أنا أعطيتك مثالين لبرهنة سهولة لغة Go لكنك لا تستطيع إعطائي مثالاً واحداً لبرهنة أن لغة سي هي أسهل من باقي اللغات في المهام المعقدة أو حتى العادية
الSwift هى تسهيل للObjective C و ليست بديل لها! مثلما الC# هى تسهيل للسى++ و ليس بديل لها!
ليس هناك علاقة بين c# و س++ لا تسهيل ولا بديل، سي شارب منافسة للغة جافا أي موجهة لبرامج الويب وبرامج المؤسسات عموماً، إذا كانت تسهيل للغة سي فهذا يعني أنها تُستخدم في ميكروسوفت لبناء نظام وندوز مثلاً لكن هذا غير صحيح
و جوجل لا تستخدم Go فى اى شىء critical.
قوقل تستخدم Go في اليوتيوب وفي محرك البحث، راجع هذا الرابط:
هذه اللغات موجهه أساسا لمواقع الويب و برامج المؤسسات (المخازن, الحسابات, الخ).
لا توجد أي من اللغات التي ذكرناها Swift, Go, Rust موجهة لبرامج المخازن والحسابات، كل لغة موجهة لنوع معين، مثلاً لغة Go موجهة للبرمجة السحابية وتعدد الأنوية والبرمجة المتوازية وموجهة لمعارية الـ Microservices
كذلك Swift موجهة لتطبيقات الموبايل، ولغة Rust هي لغة Native لبرامج سطح المكتب وكبديل للغة سي وسي++، وليس للمخازن أو الحسابات كما ذكرت
لكن سي شارب يمكن أن يكون هذا مجال الحسابات والمخازن مناسب لها وقد رأيت برامج مكتوبة بها
أحد مصممي go هو هو كن ثومبسون Ken Thompson، و هو نفسه مطور نظام يونكس الأصلي و أحد مصممي لغة C. بحسب ما قرأت من عدة مصادر، يوجد إجماع على أفضلية go للتطبيقات التي تتطلب الاستفادة من الحوسبة المتوازية. من ينتقدونها يعيبون أنها مجمعة نفايات garbage collected.
أنا لي تجربة مع Rust، لكن لم أنجز إلا أشياء بسيطة بها. هي مناسبة أكثر للأنظمة و التطبيقات التي تتطلب سرعة عالية في التنفيذ.
وإذا كانت تكفيهم لغة سي لإنتاج المتصفح لما قاموا بإيجاد بديل لها وهي Rust
هذا اعتقاد شائع، لكنه خاطئ. لم تبدأ Rust من Mozilla، بل من مجموعة مطورين. مؤسسة موزيلا صارت ترعى Rust و تبنتها و صارت تستخدمها، مثل أجزاء من محرك الويب Gecko تشمل محرك CSS الذي كتب بلغة Rust و يسمى Stylo.
ضربت لى مثلا بمكتبة socket و http,
هذا كود سى/سى++ بسيط بwinsock,
لا أفهم ما الغرض من استبدال هذا الكود البسيط نوعا ما بمكتبة لا نعرف ما المشاكل و الاخطاء بداخلها.
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
return false;
// Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( m_socket == INVALID_SOCKET ) {
gcvt((float)WSAGetLastError(),5,err_code);
WSACleanup();
return false;
}
// Set Timeout
setsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&TIMEOUT,sizeof(TIMEOUT));
// Set Receive Buffer
int z=0;
int old_rcvbuf=0;
int sss=sizeof(int);
// Bind the socket.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = INADDR_ANY;
service.sin_port = htons(http_config->port);
if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
closesocket(m_socket);
WSACleanup();
return false;
}
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
int iOptVal;
int iOptLen = sizeof(int);
//setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR , (char*)&bOptVal, bOptLen);
// Listen on the socket.
if ( listen( m_socket, 1000 ) == SOCKET_ERROR )
return false;
الأن قم بحل هذه المشكلة,
أريد ان احدد الTIMEOUT و حجم الbuffer الخاص بالsocket فى Go؟
فى سى/سى++ و winsock سوف تقوم باستخدام setsockopt لكن فى مكتبة Go أين الحل؟
هذا مثال بسيط, هناك العديد من الoptions و الخدع الدقيقة التى سوف تحتاجها عاجلا ان اجلا ان اردت استخدام هذا فى شىء حقيقى,
لا يمكننى حتى ان اجد فى الكود الخاص بك اى طريقة لارجاع الhandle الخاص بالsocket, لادخاله فى مكتبات النظام و تولى زمام السيطرة.
الwinsock بسيطة و لا تحتاج الى مكتبات حولها,
الHTTP ايضا بروتوكول بسيط نسبيا, و يمكن فى يوم او اثنين على الأكثر عمل Parsing كامل للبروتوكول (و قد فعلت ذلك بالفعل).
هذا المثال غير واضح، لغة سي غير مقروءة ماذا يفعل هذا الكود لأعطيك مثله في لغة Go
بالنسبة للـ timeout فيمكن ببساطة:
timeout := time.Duration(40 * time.Second)
client := http.Client{
Timeout: timeout,
}
response, err := client.Get(aurl)
هذا مثال لبرنامج socket client/server لغة Go حتى لمن لا يعرف تلك اللغة يستطيع فهم البرنامج،
أما البرنامج الذي أرسلته فحتى من يعرف لغة سي لا يستطيع فهم هذا البرنامج
لو أعطيتني مثال لخدمة ويب بلغة C تقوم بإرجاع JSON كان يمكن مقارنتها بالكود المقابل للغة GO كذلك Reverse proxy
توجد مقالة بها مقارنة جميلة تقيس استهلاك الكهرباء للغات البرمجة والذاكرة:
هذه الفقرة مقتبسة منها فيها تلخيص للاستهلاك بناءً على نوع المترجم:
“On average, compiled languages consumed 120J [joules] to execute the solutions, while for a virtual machine and interpreted languages this value was 576J and 2365J, respectively.”
اللغات الـ compiled مثل سي و Go و Rust تستهلك 120 جول
التي تستخدم آلة افتراضية مثل جافا ودوت نت 576 جول
التي تستخدم مفسر مثل PHP و بايثون تستهلك 2365 جول
لم تفهم مقصدى,
مثالى الTIMEOUT و الBuffer size هو ما جاء فى بالى,
عندما تستخدم مكتبة ما, سواء كنت تبرمج بGo او سى أو اى شىء أخر, فأنت فى حقيقة الأمر أسير لما حدده لك سلفا كاتبو هذه المكتبة ان تفعله,
مادمت تستطيع استهداف نظام التشغيل أو النظام مباشرة بسهولة نسبية (كما هو فى المثال الذى كتبته), فلا داع لاستخدام المكتبات.
المكتبات تستخدم عندما تريد اضافة قدرة ليست فى صميم البرنامج و تأخذ وقتا طويلا فى العمل (مثلا اضافة Theme الى الواجهة, هذه ليست فى صميم البرنامج, و تأخذ وقتا طويلا من العمل.
و الا يصبح برنامجك هو re-implementation حول مكتبة أو تكنولوجيا معينة, مثلا كمتصفح Webkit او chromium based.
ما اقوله هنا, أن المكتبات المرفقة مع اللغة لا تميزها, و ليست جزءا منها. و الsockets و الHTTP هى اشياء لا تحتاج الى مكتبات بالأساس, فكما فى بضعة سطور بسيطة يمكن عملها باستخدام winsock.
وجود مكتبة لعمل sockets و HTTP لا تجذبنى حاليا, فكما قلت لك لدى مكتبتى الخاصة, و هى أكثر كفاءة من مكتبة Go بالنسبة لى, ليست لأنها أفضل, بل لأننى استطيع تعديلها و اضافة ما أريد من قدرات لها بمجرد الحاجة اليها.
لا تنسى ايضا ان الكود الذى وضعته هو من داخل function,
و يتم استدعائها ببساطة بشىء كهذا
m_socket=CreateListeningSocket(port,TIMEOUT)
الجزء الذى تراه يتم ترجمته فقط عندما يكون نظام التشغيل Win32, ده باستخدام الdirective
.
.
فى حالة اللينوكس, او اى نظام تشغيل أخر, سوف أضيف الاكواد التى تستهدف مكتبة النظام الخاصة به (لاحقا انشاء الله), و بهذا - نظريا - يمكن فقط نقل الاكواد و اعادة ترجمتها لكل منصة على حدة.
المكتبة توفر Interface يعزلك عن التفاصيل implementation فبغض النظر عن نظام التشغيل الذي سوف يتم إصدار ملف ثنائي له لا يتأثر مصدر البرنامج.
نعم الكفاءة سوف تقل عندما يكون هُناك دالة وكيلة proxy/wrapper في الوسط بين من المستفيد وبين نظام التشغيل، لكن في سبيل عزل وتوحيد للكود وفصل الجزء التجريدي من الجزء الذي يحوي التفاصيل، بالإضافة إلى أن من يقوم بكتابة تلك المكتبات لا يخفي عنك وظيفة مهمة، إنما يقوم بتوفير كل اﻹمكانات لبرمجة الـ socket مثلاً ، فهو شيء قياسي يعتمد عليه كل عمل النت، وبما أن لغة Go موجهة لبرامج الشبكات واﻹنترنت فليس من العقل أن يقوم مطورو اللغة بإخفاء وظائف في هذا المجال
هذا الكود لتعديل الـ buffer size
func main() {
addr, _ := net.ResolveUDPAddr("udp", ":8089")
conn, _ := net.DialUDP("udp", nil, addr)
conn.SetWriteBuffer(10 * 1024)
fd, _ := conn.File()
value, _ := syscall.GetsockoptInt(int(fd.Fd()), syscall.SOL_SOCKET, syscall.SO_SNDBUF)
log.Println(value)
fd.Close()
conn.Close()
}
وهذا برنامج multi-thread socket server : // concurrentSocket project main.go package main
import (
"bufio"
"fmt"
"math/rand"
"net"
"os"
"strings"
"time"
)
func main() {
arguments := os.Args
if len(arguments) == 1 {
fmt.Println("Please provide a port number!")
return
}
PORT := ":" + arguments[1]
l, err := net.Listen("tcp4", PORT)
if err != nil {
fmt.Println(err)
return
}
defer l.Close()
rand.Seed(time.Now().Unix())
for {
c, err := l.Accept()
if err != nil {
fmt.Println(err)
return
}
go handleConnection(c)
}
}
func handleConnection(c net.Conn) {
fmt.Printf("Serving %s\n", c.RemoteAddr().String())
for {
netData, err := bufio.NewReader(c).ReadString('\n')
if err != nil {
fmt.Println(err)
return
}
temp := strings.TrimSpace(string(netData))
if temp == "STOP" {
break
}
result := time.Now().String() + "\n"
c.Write([]byte(string(result)))
}
c.Close()
}
func random(min, max int) int {
return rand.Intn(max-min) + min
}
هذا نظام تشغيل جديد اسمه Redox تمت كتابته بواسطة Rust:
هُناك مؤشر مهم، وهي أن مبرمجي لغة Go هم اﻷعلى دخلاً، والمعروف أن الدخل العالي يأتي من الشركات الكبرى مثل قوقل، وهذا دليل على أنها مستخدمة من قبل الشركات الكبرى ويتم اﻹعتماد عليها في مشاريع كبرى وإلا ما كان اﻹنفاق عليها بهذه الطريقة:
أيضا أين المؤشرات فى Go؟ و كيف يمكن حجز و تحرير الذاكرة و تمريرها من مكان الى أخر؟
هل يمكن استهداف مكتبات النظام بشكل مباشر؟ (Windows API(؟
أم انك محدد بما قرر مبرمجو Go لك ان تفعله سلفا؟
أيضا أين المؤشرات فى Go؟ و كيف يمكن حجز و تحرير الذاكرة و تمريرها من مكان الى أخر؟
هذا مثال للمؤشرات، يمكنك تشغيله وتعديله بالضغط على اﻷيقونة أعلى الكود (على اليمين)
هل يمكن استهداف مكتبات النظام بشكل مباشر؟ (Windows API(؟
نعم، راجع هذين الرابطين:
اعتقد أن لغة سي نجحت في المجالات التي تم استخدامها فيه لوقت طويل ولم يكن لها منافس، وبعد ظهور لغات منافسة أصبح من الصعب أو من غير المجدي أو غير العملي إعادة كتابة ملايين اﻷسطر المكتوبة بلغة سي، مثل أنظمة التشغيل، ومحركات قواعد البيانات، وبعض أو معظم مترجمات لغات البرمجة، والمجال المهم الذي تتفرد فيه وتنافس فيه لغة أسمبلي وهو مجال المعالجات الدقيقة microcontrollers
قرأت لأحدهم ذات مرة: "المميز في لغة سي أن لا شي مميز فيها !".
سي هي أول abstraction فوق لغة أسمبلي ولذلك هي قوية وسريعة جدًا. لا تحتوي على كانس قمامة (garbage collector) وتوفر كل الـ overhead الذي يتسبب به فهي اقتصادية جدًا للموارد (وهذا طبعًا له جوانبه السلبية في بعض الاستخدامات).
سي تترك للمبرمج الحرية والمسؤلية الكاملة عن كل ما يقوم به.
بالطبع, هذا صحيح تماما.
رغم ذلك هناك الكثير من الmemory managers حاليا لسى++ اذا أردت برمجة أمنة.
لكن كناس القمامة ضررة أكبر من نفعة, على صعيد الاداء أقله.
مرحبا أستاذ فادي لدي إستفسار إن كان ممكن أن تساعدني . يمكنك القول أنني تعلمت أساسيات C وقرأت بعض الأكواد التي كتبتها في هذا الموضوع لكنني لم أفهم شيء . هل يمكنك أن تخبرني الخطوة التالية حتى أصل إلى مستوى متقدم في اللغة وشكرا .
الاكواد التى كتبتها فى هذا الموضوع تتعلق باستهداف مكتبة winsock و التى تتحكم فى شبكات بنظام ويندوز, بالطبع سوف تكون غامضة بالنسبة لك اذا لم تكن معتادا على مكتبات ويندوز و برمجة الشبكات.
لا تقلق, هذا سوف تتعلمه لاحقا.
نصيحتى لك أن تبدأ باستهداف تشغيل معين أو منصة معينة, بحسب هدفك,
هل تريد برمجة الدسكتوب؟
اذن تعلم العمل على Visual C++ او C++ Builder,
هل تريد برمجة الmicrocontroller بواسطة سى؟ اذن تعلم برمجة الmicrocontroller الذى تريده.
انت درست السى نظريا و جاء اليوم وقت التطبيق!
نصيحتى أن تبدأ ببرمجة الدسكتوب فهذه سوف تفتح لك كل شىء أخر بعدها.
التعليقات