مقارنة بين سرعة لغات البرمجة: جافا، Go، , سي
في مناقشة مع اﻷخ فادي حول موضوع (هل يمكن ل Go أو Rust أن تتفوق على ++C في المستقبل )
http://tiny.cc/w6t64yاقترحنا أن نقوم بتجربة عملية لمقارنة سرعات لغات البرمجة، بحيث نبدأ بمثال بسيط ثم نقوم بالتعقيد لبرامج أكثر تقدماً.
البرنامج اﻷول هو لحساب هل الرقم أولي أما لا.
قمت بكتابة كود بالجافا ولغة Go فكانت النتيجة أن السرعة تقريباً واحدة، في معالج Core i3-5005U
هذه نتيجة برنامج جافا:
6673214311 Is prime
Operation took 56 seconds
وهذه نتيجة لغة Go:
6673214311 is Prime
Execution took: 52 seconds
نجد أن لغة Go أسرع فقط بأربع ثواني.
هذا كود الجافا:
public static void main(String[] args) {
Date starttime = new Date();
long number = 6673214311L;
System.out.print(number + " Is ");
if (isPrime(number)){
System.out.println("prime");
} else {
System.out.println("not prime");
}
Date endtime = new Date();
long elapsed = (endtime.getTime() - starttime.getTime());
System.out.println("Operation took " + (elapsed/ 1000) + " seconds");
}
public static boolean isPrime(long number) {
boolean prime = true;
for(long i = 2; i <= number/2; ++i)
{
// condition for nonprime number
if(number % i == 0) {
prime = false;
break;
}
}
return prime;
}
وهذا كود لغة Go:
package main
import ("time")
func main() {
starttime := time.Now()
var number int64
number = 6673214311
print(number, " is ")
if isPrime(number) {
println("Prime")
} else {
println("not prime")
}
elapsed := time.Since(starttime) / 1000000
println("Execution took: ", elapsed/1000, "seconds")
}
func isPrime(number int64) bool {
var prime = true
var i int64
for i = 2; i <= number/2; i++ {
if number%i == 0 {
prime = false
break
}
}
return prime
}
ويمكن تحميل الكود الناتج من جافا ولغة Go من هذا الرابط:
http://code.sd/share/Prime.zipوهو يحتوي على ملف تنفيذي بلغة Go لنظم لينكس 64 بت، وآخر لوندوز 64 بت، وثالث جافا 8 لتشغيل برنامج الجافا:
java -jar JavaPrimeNumber.jar
ننتظر اﻷخ @فادى لكتابة برنامج بلغة C أو ++C
التعليقات
الحقيقة الأداء ليس هو و لا يجب ان يكون المعيار الوحيد لإختيار لغة على أخرى.
الحقيقة كود ابطأ بعدة ملي ثواني و نظيف افضل بكثير من كود سريع و غير قابل للإصلاح.
يذكرني بشخص لا يستخدمforeign key في قواعد البيانات لأنه "يسبب بطء" و يقوم بحذف الصفوف يدويا بإستعلام آخر. و تجد الاستعلام يأخذ عدة ثواني ، و عندما قمت بتحسينه و استخدام ميزات caching و in memory lookup اصبح الإستعلام اسرع بحوالي ٦٠ مرة!
و أيضاً لا يستعمل class في php بل يستعمل procedural فقط بسبب الأداء. و النتيجة تعديل صغير يسبب توقف النظام عن العمل.
ايضاً لديك اللغات الوظيفية تسمع عنها انها أبطأ من لغات مثل سي++ ، و لكن بالمقابل إنتاجيتها اعلى بكثير منها ، و نظريا (من وجهة نظر شخص ليس له فكرة كافية عن كيفية عمل GC او JIT) انها تستعمل ذاكرة اكثر بكثير بسبب immutability ، و لكن الحقيقة ليست بذلك السوء ابداً.
أيضاً هناك نوع آخر ضد كل لغات VM و يستعمل نود ، لأنه يظن ان VM هنا هي مثل Virtual Box ثقل بلا فائدة ، ولا يدري ان كل من V8 و JSCore او CLR هم بالحقيقة VM و لكن بأسماء أخرى وبعض الاختلاف الطفيفة ولكن نفس المبدأ.
الحقيقة يجب الاهتمام بطريقة التطوير بدل التعصب لتقنية ما ، السيرفرات رخيصة و لكن المبرمجين ليسوا كذلك.
توجد لغة جديدة مشابهة لـ PHP اسمها جوليا، يُقال أنها أسرع
كذلك توجد لغة Hack التي قامت بتطويرها فيسبوك من لغة PHP هي أيضاً سريعة
جوليا Julia لغة برمجةعامة الأغراض صممت أساساً لأغراض تحليل البيانات، مثل بايثون، ليس php.
الهدف منها أن تكون لغة سريعة و أداء يشبه C أو C-like performance.
اللغة بها JIT Compiler عكس بايثون التي لها Interpter.
عند استخدامك لأي مكتبة لأول مرة، يجري عملية ترجمة ابتدائية pre-compiling، ربما من أجل الاسمتثال optimization مثل دعم SSE أو AVX.
على الهامش، أيها الأستاذ معتز
هل تفكرون في الشركة الانتقال لـغو بما أنكم تعملون في مجال الاتصالات.
ألا تظن أن موقع شركتكم يحتاج تطويرا، فتصميمه ليس عصريا
في الحقيقة نحن نستخدم أكثر من لغة برمجة لا يوجد توجه معين لاستخدام لغة واحدة فقط. نستخدم جافا ولغة PHP و JavaScript و لغة Go، كل لغة لديها نقطة قوة في مجال معين، التحول ليس بالشيء السهل، لكن المشروعات الجديدة يمكننا استخدام لغة جديدة معها، مثلاً Go أو NodeJS.
موقع الشركة لم نقم بتطويره لأننا لا نتعامل مع زبائن كُثر ولسنا جاهزين بعد للانطلاق في السوق بمنتجاتنا، نعمل اﻵن مع شركتي اتصالات وهما يأخذان كل جهدنا ووقتنا، ليس لدينا سوي نظامين أو ثلاثة تصلح للاستخدام العام وتحتاج بعض التطوير، ولدينا عدد من الطلبات من الزبائن لم نستطع تلبيتها، لذلك كل جهدنا كان موجه للبرامج أولاً أن تصبح منتجات جاهزة ثم التسويق ثانياً.
لكن هو في الخطة عندما ينتهي مصممو المواقع الذين يعملون معنا من ألانتهاء من المشروعات التي يعملون عليها.
مقارنة مميزة بين لغات البرمجة في تنفيذ خوازميات معقدة:
https://benchmarksgame-team...
Go vs. C++
https://benchmarksgame-team.../faster/go-gpp.html
Go vs. C
https://benchmarksgame-team.../faster/go-gcc.html
للفائدة:
C vs. C++
https://benchmarksgame-team.../faster/c.html
أسرع لغة هي C، وأبطأها Python أو على اﻷقل ما قمت بتجرتبه، لغة Python بطيئة بطريقة مبالغ فيها:
هذه نتيجة لغة باسكال: باستخدام Free Pascal
6673214311 is prime
Duration in seconds = 53.4
أبطأ بقليل من لغة Go
هذا هو الكود:
program PrimePascal;
uses sysutils;
function isPrime(number : int64) : boolean;
var
i: Int64;
begin
result := true;
for i:= 2 to number div 2 do
begin
if number mod i = 0 then
begin
result := false ;
break ;
end;
end;
end;
var
number: int64;
starttime, endtime: TDateTime;
begin
starttime:= now;
number := 6673214311;
write(number, ' is ');
if isPrime(number) then
begin
writeln('prime');
end
else
begin
writeln('not prime');
end;
endtime:= now;
writeln('Duration in seconds = ', format('%0.1f', [(endtime - starttime) * 24 * 60 * 60]));
end.
لو لديك نظام ويندوز يمكنك تجربة برنامجى عليه
هل يمكنك ان تعطينى exe؟
أعتقد انه سوف يكون بنفس السرعة على حاسوبى,
هل يمكننا حسابها بالmillisecond؟
النتيجة هي 22 ثانية في اطار NodeJS ( محرك V8 )
6673214311 Is
prime
Operation took 22.704 seconds
الشفرة المصدرية ( كتبت بإستخدام typescript ونفذت بإستخدام ts-node )
function isPrime(num: number): Boolean {
let prime: Boolean = true;
for(let i = 2; i <= (num / 2); ++i)
{
if(num % i == 0) {
prime = false;
break;
}
}
return prime;
}
(function calculate() {
let starttime: Date = new Date();
let number: number = 6673214311;
console.log(number + " Is ");
if (isPrime(number)){
console.log("prime");
} else {
console.log("not prime");
}
let endtime: Date = new Date();
let elapsed: number = (endtime.getTime() - starttime.getTime());
console.log("Operation took " + (elapsed/ 1000) + " seconds");
})();
وماهو المعالج الذي تم فيه الاختبار، وماهي سرعة باقي البرامج في نفس الجهاز. أقصد البرامج المرفقة في الرابط التالي:
لغة Go الناتج هو 26 ثانية
6673214311 is Prime
Execution took: 26 seconds
لغة جافا الناتج هو 28 ثانية
6673214311 Is prime
Operation took 28 seconds
وماهو المعالج الذي تم فيه الاختبار
نظام ومواصفات جاهزي
Operating System: KDE neon 5.15
KDE Plasma Version: 5.15.4
KDE Frameworks Version: 5.57.0
Qt Version: 5.12.0
Kernel Version: 4.18.0-17-generic
OS Type: 64-bit
Processors: 8 × Intel® Core™ i7-7700HQ CPU @ 2.80GHz
Memory: 15.6 GiB of RAM
بإمكانك تجربة المثال في جهازك اتوقع النتيجة سوف تكون افضل من go وjava على اخذ benchmark الذي ارسلها المجهول في الاعلى
شكراً
كيف يمكن تشغيل برنامج NodeJS علماً بأن لدي NodeJS على الجهاز، لكن نسيت كيف يتم تشغيل البرنامج
الشفرة المصدرية التي في الاعلى كتبة بواسطة لغة TypeScript ونفذت بإستخدام ts-node
بإمكانك تثبيت ts-node بالامر التالي
npm install -g typescript ts-node
ثم احفظ الشفرة المصدرية التي في الاعلى بامتداد .ts وقم بتنفيذ ts-node من الطرفية ملحق باسم الملف مع الامتداد
ts-node filename.ts
او بإمكانك حفظ شفرة JavaScript التالية بإمتداد .js
function isPrime(num) {
var prime = true;
for (var i = 2; i <= (num / 2); ++i) {
if (num % i == 0) {
prime = false;
break;
}
}
return prime;
}
(function calculate() {
var starttime = new Date();
var number = 6673214311;
console.log(number + " Is ");
if (isPrime(number)) {
console.log("prime");
}
else {
console.log("not prime");
}
var endtime = new Date();
var elapsed = (endtime.getTime() - starttime.getTime());
console.log("Operation took " + (elapsed / 1000) + " seconds");
})();
ثم تفيذها بإستخدام nodejs
node filename.js
قمت بتنفيذها باستخدام TypeScript و NodeJS كانت النتيجة أن الأسرع هي TypeScript
ts-node filename.ts
6673214311 Is
prime
Operation took 39.834 seconds
node prime.js
6673214311 Is
prime
Operation took 40.616 seconds
السؤال هل لغة TypeScript جزء من منصة NodeJS أم أن منصة Node تشمل اللغتين؟
TypeScript هي لغة مفتوحة المصدر من مايكروسوفت تترجم إلى لغة جافاسكربت مايميزها انها تضيف دعم الأنواع للغة جافاسكربت وايضًا ترجمة كود حديث من es7 أو es6 أو es8 الى es5 وبعض الميزات الإضافية الأخرى مثل interfaces و enums
هل يتم ترجمتها إلى JavaScript في الـ Server side أم في طرف المتصفح فقط
لأنه لو تم ترجمتها إلى جافاسكريتب فبذلك تكون أبطأ من جافا سكريتب
هذا الفارق طفيف وقد يكون مجرد هامش الخطأ، لكن عموماً التايبسكريبت في البرامج الكبيرة يتوقع أن تكون أسرع من الجافاسكريبت لأنها تجبر المبرمج على اتباع أساليب تسهل على نود عمل optimization. مثلاً، من الأمور التي أعرفها أن نود تحسن أداء الدالات إذا استدعيتها دائنا بنفس الصنف من المدخلات والتايبسكريبت تجبر المبرمج على ذلك.
الغريب أن TypeScript تظهر بطيئة في اختبار binary-tree مثلاً، مقارنة باللغات الـ compiled مثل C, Rust, Pascal
السلام عليكم ورحمة الله،
المعالج: Core) i3-4005U)
النظام: ويندوز 10
هذا ما وصلت له بعد التعديل على شفرة nodejs أعلاه والاستعانة بStackoverflow
هذا باستعمال dart فقط
6673214311 Is prime executed in 0:01:18.865655أما هذا فباستعمال dart snapshot:
6673214311 Is prime executed in 0:01:17.608316الشفرة:
isPrime(var num){ var prime = true; for (var i = 2; i <= (num / 2);++i ){ if(num % i ==0){ prime = false; break; } } return prime; } main(){ final stopwatch = Stopwatch()..start(); int number = 6673214311; print (number); print("Is"); if (isPrime(number)){ print("prime"); } else { print("not prime"); } print('executed in ${stopwatch.elapsed}'); }
هل التنفيذ أخذ دقيقة و سبعة عشر ثانية؟
كلمنا قليلاً عن لغة دارت، هل هي client-side أم مثل الـ NodeJS تعمل في الطرفين؟
بطأ التنفيذ بسبب حاسوبي، فـ Dart VM سريعة (في بعض الاختبارات كانت أسرع من V8)
هي مثل nodejs في الطرفين، في 2011 عندما أصدرتها غوغل كانت لاستبدال JavaScript
لكن المتصفحات الأخر رفضت هذا، وقبل مدة أصدرت النسخة 2، ومعها يجب أن تحول دارت لجافاسكربت في المتصفح (مثل تايب سكربت) وأما في السيرفرات والهواتف (flutter) فتترجم للغة الآلة مباشرة.
هذا ما أعرفه وهو غيض من فيض لأني مبتدأ.
*ملاحظة: وقت التنفيذ الفعلي هو 1:18 (لأن snapshot تشبه exe لكن تنفذ في آلة دارت)
لمعرفة أن البطئ من حاسوبك قم بتجربة باقي اللغات.
مثلاً برنامج جافا و Go
في لغة الأسس استغرق 27 ثانية
6673214311 is prime
Operation took 27 seconds
الشفرة المصدرية
import "Srl/Console.alusus";
module SpeedTestModule {
def clock: @expname[clock] function (): Int[64];
func start(argCount: Int, argv: ptr[array[ptr[Char]]]) {
def number: int[64] = 6673214311;
def startTime: int[64] = clock();
Srl.Console.print("%ld is ", number);
if (isPrime(number)){
Srl.Console.print("prime\n");
} else {
Srl.Console.print("not prime\n");
};
def endTime: int[64] = clock();
def elapsed: int[64] = (endTime - startTime);
Srl.Console.print("Operation took %d seconds\n", (elapsed/1000000));
};
func isPrime(number: Int[64]): Bool {
def prime: Bool = 1;
def i: int[64];
for i=2, i<= (number/2), i++ {
if((number % i) == 0) {
prime = 0;
break;
}
};
return prime;
};
};
run SpeedTestModule.start;
لغة برمجة انطلقت في 2014 اخر اصدار 0.4.1 مكتوبة بلغة C/C++ وتستخدم llvm
مستودع اللغة في github:
قارنت سرعتها بلغة Go فكانت اسرع منها
لغة Go
6673214311 is Prime
Execution took: 27 seconds
لغة Alusus
6673214311 is prime
Operation took 26 seconds
هل تستخدمها في مشروعات حقيقية؟
ليست جاهزة لاي مشروع كبير لكن بالإمكان بواسطتها فعل ماتريد فهي لغة ليست مستهدفه لمجال واحد
بإمكانك ايضًا استدعاء اي مكتبة C او C++ ( اي مكتبة مشاركة ) في اللغة مباشرة
يوجد بعض المشاريع يعمل عليها بإستخدامها في منظمة الأسس في github
بإمكان اي شخص اضافة دعم لاي لغة مثل الصينية والاردو وغيرها للغة الأسس
المثال السابق بلغة الأسس العربية
اشمل "مـتم/طـرفية.أسس"؛
حزمة اختبار_سرعة_اللغة {
عرف ساعة: @تصدير[clock] دالة (): صـحيح[64]؛
دالة البدايه(argCount: صـحيح, argv: مؤشر[مصفوفة[مؤشر[محرف]]]) {
عرف الرقم: صـحيح[64] = 6673214311؛
عرف بادية_الوقت: صـحيح[64] = ساعة()؛
مـتم.طـرفية.اطبع("%ld هو ", الرقم)؛
إذا (هل_هو_اولي(الرقم)){
مـتم.طـرفية.اطبع("اولي\n")؛
} وإلا {
مـتم.طـرفية.اطبع("ليس اولي\n")؛
}؛
عرف نهاية_الوقت: صـحيح[64] = ساعة()؛
عرف وقت_التنفيذ: صـحيح[64] = (نهاية_الوقت - بادية_الوقت)؛
مـتم.طـرفية.اطبع("العملية اخذت %d ثانية\n", (وقت_التنفيذ/1000000))؛
}؛
دالة هل_هو_اولي(الرقم: صـحيح[64]): ثنائي {
عرف اولي: ثنائي = 1؛
عرف ف: صـحيح[64]؛
لكل ف=2, ف<= (الرقم/2), ف++ {
إذا ((الرقم % ف) == 0) {
اولي = 0؛
اقطع؛
}
}؛
أرجع اولي؛
}؛
}؛
نفذ اختبار_سرعة_اللغة.البدايه؛
6673214311 Is prime
Finished in : 49 Seconds
انتصرت 49 ثانية!
Interl i5 8300H 2.30Ghz
C++ Builder 10.2 Tokyo
: Code
#pragma hdrstop
pragma argsused
include
ifdef _WIN32
include
include
else
typedef char _TCHAR;
#define _tmain main
endif
include
bool IsPrime(__int64 number)
{
bool prime=true;
for(__int64 i=2;i<=(number/2);+i++)
{
if(number%i==0){
prime=false;
break;
}
}
return prime;
}
int _tmain(int argc, _TCHAR* argv[])
{
ULONGLONG time_1=GetTickCount64(); // Get Start time
ULONGLONG time_2,time_elapsed;
__int64 number=6673214311;
std::cout<<number<<" Is ";
if(IsPrime(number))
std::cout<<"prime\n";
else
std::cout<<"not prime\n";
time_2=GetTickCount64();
time_elapsed=time_2-time_1;
std::cout<<"Finished in : "<<(time_elapsed/1000)<<" Seconds\n";
return 0;
}
هل قمت بتجربة باقي البرامج في نفس معالجك؟
نرجو إعادة تنسيق الكود حتى يتسنى لنا نسخه وترجمته، يحتاج الكود لأربع مسافات أمام كل سطر، وتأكد من حذف الـ tabs
أو قم برفعه في مكان ما.
لذلك أنا وضعت ملف به الملفات التنفيذية:
http://code.sd/share/Prime.zip
لكن لا بأس قم بتجربة مترجم لغة Go و LiteIDE
هذه من الميزات التي كلمتك عنها المتوفرة في مترجم Go وهو الـ Cross-compliation حيث تستطيع من نظام واحد إصدار برامج تنفيذية لعدد من المعماريات وأنظمة التشغيل
استطيع بC++ Builder اصدار نسخة لMac OS X و كذلك IOS و Android
C++ builder يستخدم اساسا لبرامج سطح المكتب, و لينكس قلما يستخدم فى سطح المكتب, لكن Embarcadero سوف تدعمه قريبا.
وفر هذا النقاش لموضوع اخر :)
لكن نسبة MAC OS X ديسكتوب تبلغ 12% تقريبا, بينما لينكس لا تتعدى ال1.5%
فمن الطبيعى تماما ان يهتم مهندسوا Embarcadero بالترجمة لMAC OS أولا!
لكن هنا تظهر قوة السى++, بمجرد نقل الملف الى اى ماكينة لينكس, تستطيع ترجمة نفس الكود بالضبط بواسطة g++ او ايا كان!
فقط سوف تعيد كتابة الMake File .
برامج سطح المكتب أصبحت من الماضي، المؤسسات الآن تستخدم برامج الويب والتي يعمل معظمها في بيئة لينكس، لذلك سوف تخسر شركة Embarcadero السوق، هل تم بيعها للمرة الثالثة أو الرابعة بعد كل فشل في التسويق؟
لكن هنا تظهر قوة السى++, بمجرد نقل الملف الى اى ماكينة لينكس, تستطيع ترجمة نفس الكود بالضبط بواسطة g++ او ايا كان!
القوة الحقيقية هي إنتاج ملفات تنفيذية من نظام تشغيل مختلف Cross-platform والتي لم تستطيع إثباتها باستخدامك للغة سي
Embarcadero لها حاليا وجود قوى فى مجال تطبيقات الموبايل. عن تجربة برمجة الاندرويد بالDelphi و الC++ Builder أفضل كثيرا من Android Studio.
و هى شركة رابحة و لا تخسر الاموال.
فى مجال عملى لم أرى لينكس فى حياتى, فى الحقيقة معظم الشركات المتوسطة تستخدم Windows Server لأنه أكثر ثباتا و أسهل فى الادارة و هذه الشركات لا تمتلك عدد كبير من موظفى تقنية المعلومات, فيصبح Windows Server هو دائما الخيار الأمثل.
يمكنك أن تراجع التقارير و الاحصائيات, Linux يعمل فى جوجل و فيسبوك, لكن فى الشركات المتوسطة فان Windows Server يسيطر تماما.
حوالى 60% من الخوادم فى العالم هى خوادم Windows Server, لكن فى مجال خوادم الويب تنخفض هذه النسبة الى 23%.
ليس هناك بديل حقيقى لActive Directoryفى لينكس, كما أن دعم مايكروسوفت أفضل و نظام الUpdates أفضل و سد الثغرات الأمنية أسرع و اكثر استقرارا.
برامج سطح المكتب لا تزال موجودة, هناك أشياء لا يستطيع الويب فعلها, مثل التحكم فى الHardware, و حتى أشياء مستخدمة بكثرة فى الانترنت مثل Peer 2 Peerو الBackground applications
العالم ليس محصورا فى برامج الحسابات و ادارة المؤسسات!!
لا جدال، البرامج وأنظمة التشغيل عالم كبير، كل شخص يرى جزء من عالمه الكبير فقط ولا يستطيع رؤية العالم الكبير اﻵخر بتقنياته المختلفة.
نتوقف هنا عن الجدال عن أيهما أفضل لينكس أم وندوز وأي لغات البرمجة أفضل وأسرع
الجدال شيء سيء وفيه محاولة الإنتصار للنفس.
قال رسول الله صلى الله عليه وسلم "أَنا زَعِيمٌ ببَيتٍ في ربَضِ الجنَّةِ لِمَنْ تَرَكَ المِرَاءَ وَإِنْ كَانَ مُحِقًّا"
والمراء هو الجدال
أنا أيضاً في مجال عملي لا أري مخدمات وندوز كثيراً، لدينا حوالي 50 مخدم لينكس مع عدد محدود من الزبائن، الشركات الصغيرة هي التي تميل لاستخدام وندوز في المخدمات والتي ليس بها خبرة كافية ممن لديهم معرفة بنظام لينكس، دائماً مستخدمي لينكس لديهم معرفة أكثر بالعتاد والشبكات والسرية مقارنة بمستخدمي وندوز. في عالم اﻹتصالات يستخدمون يونكس و سولاريس، مثل أريكسون، هواوي، واصبح اﻹتجاه لهذه الشركات بإدخال لينكس في بعض اﻷنظمة بدلاً عن يونكس
أبنائي يستخدمون لينكس في اﻷلعاب وفي غيرها من البرامج التعليمية والويب. في أحد اﻷجهزة كان نظام التشغيل وندوز فلم يعجبهم ولم يجدوا فيه Application Center لإنزال الألعاب والبرامج، فسألني أحدهم كيف أصبحت ميكروسوفت غنية من هذا النظام، أي يعني النظام الفقير - على اﻷقل بالنسبة له مقارنة بنظام أوبونتو- بعد فترة جاوبني بعد أن وجد أن أكثر أرباح ميكروسوفت تأتي من XBox
العالم ليس محصورا فى برامج الحسابات و ادارة المؤسسات!!
هذا المجال الذي يُستخدم فيه وندوز.. من 1 إلى 10 مستخدمين، أما لينكس فيُستخدم للمخدمات التي يستخدمها مليارات المستخدمين، راجع هذه القائمة وقل لي أين وندوز من هذه القائمة:
بعثت هنا بالكود المصدرى الذى يفترض ان يعمل على لينكس.
لا أحتاج الى اثبات شىء, الcross compiling يتم فى السى/سى++ منذ قديم الأزل, و باستخدام الكود المصدرى نفسه.
هل تعتقد ان Chromium او فايرفوكس مثلا له كود مصدرى لويندوز و أخر للينكس؟!
لا أمتلك حاليا compiler للينكس و لم أعمل على لينكس من قبل. يمكنك ان تجرب بنفسك ترجمته على g++, المفترض ان يعمل و لكن ربما يحتاج لتعديلات بسيطة.
أنا غير مقتنع أن لغة C أو ++C بها Cross-compilation وإلا لماذا لم ترسل لي ملف تنفيذي لنظام لينكس.
هل تعتقد ان Chromium او فايرفوكس مثلا له كود مصدرى لويندوز و أخر للينكس؟!
أنا أعرف أنه كود مصدري واحد، لكن يمكن أن يتم عمل Compliation and testing لكل نظام تشغيل على حده وليس Cross compliation
لا أمتلك حاليا compiler للينكس و لم أعمل على لينكس من قبل. يمكنك ان تجرب بنفسك ترجمته على g++, المفترض ان يعمل و لكن ربما يحتاج لتعديلات بسيطة.
الـ cross-compliation لا يفترض وجود النظام الذي تريد إنتاج ملفات تنفيذيه له، يكفي أن يكون لديك وندوز لتنتج برامج تنفيذية لمعماريات مختلفة وأنظمة مختلفة مثل لينكس، سولاريس، FreeBSD, Mac, RasberryPi هذه كلها يمكن إنتاجها باستخدام لغة Go في بيئة وندوز
هل تتوقع ان برنامجك الcross compiled سوف يعمل بدون مشاكل على كل الانظمة التى ذكرتها؟
يا رجل هناك مشاكل تحدث بين اصدارات من نفس نظام التشغيل!! فما بالك بأنظمة مختلفة!
فى كل الاحوال انت مضطر لعمل تنقيح و debugging لكل نظام على حدة.
نعم أتوقع ذلك، خصوصاً من لغة برمجة مبنية على طبقة أعلى قليلاً من نظام التشغيل وبسببها كان النظام أبطأ، لغة سي مبنية مباشرة على نظام التشغيل لذلك هي أكثر اعتمادية على كل نظام على حده
مثلاً في لغة Go لا نحتاج إلى استخدام compiler directive لتخصيص كود معين يعمل على لينكس وجزء من الكود يعمل عند استخدام مترجم وندوز.
وإذا حدثت تلك المشاكل تقوم بحلها مرة واحدة،
هُنا تأتي أهمية التجريد والـ decoupling عن نظام التشغيل، أي أن المبرمج إذا كانت طريقته صحيحة في البرمجة يكون الناتج برنامج غير معتمد على نظام التشغيل
كل ما تقوله هى أشياء نظرية جميلة, الشيطان فى التفاصيل!!
صدقنى هذا الabstraction (و الكلام الكبير) قد يسقط بمجرد عمل update للنظام.
هل تتوقع ان مكتبات Go تغطى كل شىء فى نظام التشغيل؟
أنت مضطر لاحقا ان أجلا للولوج الى مكتبات النظام,
كمثال مكتبات Windows API أكبر و أغنى كثيرا من مكتبات unix (و هى الأساس لمكتبات سى/سى++), و بالتالى المكتبات القياسية لأى لغة كانت بما فيها سى/سى++ لا تغطى كل شىء.
حتى VCL رغم ثرائها لا تغطى كل مكتبات ويندوز الرسومية, و سوف تضطر فى مرحلة ما الى الولوج لمكتبات النظام,
كمثال, تغيير حجم و شكل Cursor الكتابة فى ويندوز Caret, مكتبات VCL لا تدعم ذلك و عليك اللجوء الى Windows API (و تخيل معى ان تفصيلة مثل هذه موجودة فى Windows API!!)
نعم صحيح الشيطان في التفاصيل.
كذلك لا أدعي أن لدي خبرة كافية للغة البرمجة Go وهل يوجد نقص في الـ cross-compilation أم لا.
نترك هذا للمستقبل بعد أن تكون لنا خبرة أطول بإذن الله.
والعبرة ليست في لغة البرمجة أو نظام التشغيل، أو قاعدة البيانات، كلها مجرد أدوات. وفريق العمل الذي يعمل معي لا أناقشه في أي اللغات أفضل، أترك هذا لهم، الشيء المهم بالنسبة لي ووظيفي هي ضمان تنفيذي وفريق البرمجة لمفاهيم هندسة البرمجيات بطريقة صحيحة وتنفيذ كل المفيد فيها لتقليل كل المشاكل التي تحدث في اﻷنظمة التي يعتمد عليها الزبائن بطريقة كبيرة ولا تتحمل أي خطأ.
صدقنى هذا الabstraction (و الكلام الكبير) قد يسقط بمجرد عمل update للنظام.
مفهوم Open Close Principle لا تشجع التعديل، إنما تشجع دائماً كتابة كود جديد بعد ورثة الكلاسات القديمة والمستقرة، لذلك لا يسقط النظام بعد عمل إضافة إنما تسقط البرامج التي لا تطبق هذا المبدأ.
كذلك مبدأ الوظيفة الواحدة Single Responsibility تعزل الوظائف عن بعضها، فإذا عدلت في وظيفة لا تؤثر على وظيفة آخرى وتُسهّل الاختبار، أي يكفي اختبار الموديول الذل قمت بتعديله.
وتطبيق مبدأ Dependancy Inversion ينص على أن الجزئية العليا (اﻷقرب إلى المستخدم) يجب أن لا تعتمد على الجزئيات الدنيا (مثل التي تتعامل مع نظام التشغيل) لا بد أن يكون هُناك طبقة عازلة أو Adapter باستخدام Interface حتى لا يصبح النظام يعتمد على منصة بعينها، حيث أن تفاصيل الـ Windows API و مكتبات Unix وال socket والـ file streams كلها تفاصيل دنيا يجب أن لا ترتقي ولا تظهر في الطبقات العليا من البرامج.
و إذا حدث فشل في النظام بعد التعديل فهذا يعني أن المبرمج لا يطبق المباديء الصحيحة للبرمجة وهو مجرد مبرمج ولم يرق إلى درجة مطور أو مهندس برمجيات بعد.
هناك شىء أخر,
انت تستخدم Java JIT, بمعنى ان المترجم يقوم بترجمة و تنفيذ كود native,
لا تنسى ان عد الوقت يبدأ عندك منذ لحظة تنفيذ البرنامج (بعد ترجمته اللحظية), هذه ثانية او ثانيتين زائدين على برنامج السى++ لم يتم احتسابهم.
فى عملية حسابية و برنامج بسيط نسبيا كل لغة فى العالم من اول البيسك لحد الكوبول و الباسكال و السى++ سوف تولد تقريبا نفس الكود و سوف تعمل بسرعة قريبة للغاية على حاسوب سريع.
الفارق يظهر عندما تبدأ الذاكرة و مكتبات النظام و خيوط التنفيذ فى الدخول.
أيا كان أنا أرى انه من الاهانة أن يحدد لى بضعة حمقى فى اوراكل أو بلهاء "جوجليين" كيفية العمل, أنا أضع القواعد بنفسى
I make my own rules!
لا تنسى ان عد الوقت يبدأ عندك منذ لحظة تنفيذ البرنامج (بعد ترجمته اللحظية), هذه ثانية او ثانيتين زائدين على برنامج السى++ لم يتم احتسابهم.
هذا الوقت يحدث مرة واحدة عند تشغيل البرنامج، مثلاً في برامج الويب يحدث هذا عندما يعمل مخدم الويب حيث يقوم بتشغيل البرامج أو عند النداء لأول دالة في برنامج ويب يقوم المترجم بترجمته ووضع نُسخة ثنائية في الذاكرة، فمثلاً إذا عمل المخدم مدة شهر بدون توقف أو إعادة تشغيل أو رفع لنُسخة جديدة من البرنامج فإن ذلك يعني ثانيتين أو ثلاثة، بل قل عشرة ثواني تأخير في الشهر، بالتأكيد هذا لن يضر بالاقتصاد العالمي.
أيا كان أنا أرى انه من الاهانة أن يحدد لى بضعة حمقى فى اوراكل أو بلهاء "جوجليين" كيفية العمل, أنا أضع القواعد بنفسى
I make my own rules!
هؤلاء الحمقى الذين تسميهم ليسو خريجين جدد ما زالوا في طور التعليم، وليسوا أشخاص قليلي الخبرة ومحدودي اﻷفق، إنما هم من مؤسسي تقنية المعلومات في العالم، ويقومون بتطوير لغات برمجة تعمل بها الشركات والمواقع الكبرى والتي بها مليارات الزيارات والاستخدامات، فهل أنت لديك احتياجات أكبر من مليارات الزيارات للبرامج التي تكتبها!
هؤلاء الحمقى الذين تسميهم ليسو خريجين جدد ما زالوا في طور التعليم، وليسوا أشخاص قليلي الخبرة ومحدودي اﻷفق، إنما هم من مؤسسي تقنية المعلومات في العالم، ويقومون بتطوير لغات برمجة تعمل بها الشركات والمواقع الكبرى والتي بها مليارات الزيارات والاستخدامات، فهل أنت لديك احتياجات أكبر من مليارات الزيارات للبرامج التي تكتبها!
هناك overrating كبير جدا لهذه الشركات.
اوراكل فى رأيى شركة متوسطة جدا, و برامجها bloated للغاية
أيا كان كل هذا لا يجعلهم أهلا لوضع القواعد لى, مادمت قادرا على وضع القواعد لنفسى التى أرتاح لها.
لا يجب استخدام مكتبات الا فى حالتين :
أن تكون المكتبة تعالج شيئا ضخما بالفعل سوف يأخذ وقتا طويلا و موارد ضخمة غير متوفرة لكتابته و صيانته (مثلا مكتبات الSSL/TLS)
أن تكون المكتبة ضخمة الى حد ما و تعالج وظيفة فرعية فى التطبيق, ليس من المنطقى أن تقضى شهورا فى العمل على وظيفة فرعية. مثلا مكتبات الواجهة الرسومية مثل VCL
بقول أخر, طالما لديك ال(قدرة) و ال(وقت) لعمل الشىء بنفسك, فما حك أنفك مثل ظفرك
بقول أخر, طالما لديك ال(قدرة) و ال(وقت) لعمل الشىء بنفسك, فما حك أنفك مثل ظفرك
معظمنا لديه القدرة، لكن ليس لدينا الوقت، نريد إنتاج برامج نسابق بها الشركات المنافسة ونرضي بها الزبائن في تنفيذ المشروعات في وقت وجيز. في النهاية معظمنا نعمل في شركات لإنتاج برامج للمستخدم النهائي، أما إذا كُنا نعمل في شركات لإنتاج برامج ومكتبات يستخدمها المبرمجين فهنا نستطيع أن نقول ما حك جلد مثل ظفرك.
هذه المقولة نطبقها في برامجنا في ناحية أعلى من لغة البرمجة وهي الـ frameworks فلا نستخدم framework جاهز بل نعتمد على مكتبات كتبناها بأنفسنا أو frameworks خاصة بنا، لكن الفرق أنها في طبقة أعلى من مكتبات لغات البرمجة وليست منافسة لها أي تعمل فوقها
احتاج لمصدر برنامج سي غير معتمد على وندوز لترجمته في لينكس.
هل يمكنك إرساله في هذا الرابط:
عزيزى,
يمكن ترجمة هذا على لينكس, هذا كود Standard C++
pragma hdrstop
pragma argsused
include
include
ifdef _WIN32
include
include
else
typedef char _TCHAR;
#define _tmain main
endif
include
bool IsPrime(__int64 number)
{
bool prime=true;
for(__int64 i=2;i<=(number/2);+i++)
{
if(number%i==0){
prime=false;
break;
}
}
return prime;
}
int _tmain(int argc, _TCHAR* argv[])
{
/* #ifdef __WIN32__
ULONGLONG time_1=GetTickCount64(); // Get Start time
ULONGLONG time_2;
#endif
*/
using namespace std::chrono;
milliseconds timel_1=duration_cast< milliseconds >( system_clock::now().time_since_epoch());
__int64 number=6673214311;
std::cout<<number<<" Is ";
if(IsPrime(number))
std::cout<<"prime\n";
else
std::cout<<"not prime\n";
#ifdef __WIN32__
time_2=GetTickCount64();
time_elapsed=time_2-time_1;
std::cout<<"Finished in : "<<(time_elapsed/1000)<<" Seconds\n";
#endif
using namespace std::chrono;
milliseconds timel_2=duration_cast< milliseconds >( system_clock::now().time_since_epoch());
long timel_elapsed=timel_2.count()-timel_1.count();
using namespace std;
std::cout<<"Finished in : "<<(timel_elapsed/1000)<<" Seconds\n";
return 0;
}
فكانت النتيجة أن السرعة تقريباً واحدة
أربع ثواني كيف تقريباً ؟ وأيضا البرامج بسيطة فألن يزداد الفارق بشكل كبير لي البرامج المعقدة
أربع ثواني تُمثل أقل من 10% فرق سرعة، والسرعة ليست دائماً لصالح لغة واحدة، راجع هذا الرابط:
https://benchmarksgame-team...
بالإضافة إلى أن البرامج المعقدة، مثل برامج الويب وخدمات الويب ليس فيها كل هذا الانتظار، مثلاً خدمة ويب تكون نتيجتها بعد ثانية أو ثانينتين، فيكون الفرق بين اللغات في هذه الحال هي أجزاء من الثانية، فعندها نقول أن اللغة X و Y سرعتهما متساوية إذا كان الفرق مثلاً بالمليثانية
حسناً ، قمت بعمل التجارب على حاسوبي ، بجافا و سي++
المعالج Core i7 4870HQ
و كانت النتيجة :
سي++: بدون optimization ، ٥٣ ثانية ، مع optimization استغرقت ٢٥ ثانية
جافا: GraalVM استغرق ٢٧ ثانية ، و native-image استغرق ٢٩ ثانية
جربت اكثر من اصدار ، يبدو ان اصدار 11 مع Corretto و J9 و SAP Machine ابطأ بحوالي ثانية من zulu
يبدو انه كل ما كان الجهاز اقوى قلت الفجوة بالأداء.
ما كل هذه المصطلحات، لا نعرف معظمها :)
نرجو تفصيل اﻵتي:
ما هو الـ Optimization الذي تقصده مع لغة سي، هل في تعديل خيارات المترجم أم تغيير في الكود؟
وماهي جافا GraalVM و native-imageK،
يبدو انه كل ما كان الجهاز اقوى قلت الفجوة بالأداء.
هل تقصد قلت الفرق بين لغات البرمجة المختلفة أم للجافا فقط؟
ما هو الـ Optimization الذي تقصده مع لغة سي، هل في تعديل خيارات المترجم أم تغيير في الكود؟
في المترجم O3 ، لم أرد تغيير الكود.
وماهي جافا GraalVM و native-imageK،
كما تعرف هناك الكثير من JDK و VM للجافا ، لديك HotSpot او J9 امثلة على VM.
Graal هو مترجم جديد للجافا و العديد من اللغات الأخرى يعمل على hotspot حاليا ، و أيضاً فيه ميزة ان تنشئ native image من الجافا او اللغات الأخرى ، يعني تصبح كما تترجم C++ الى لغة الآلة ،و لكن لجافا و اللغات المدعومة الأخرى.
فائدة native image هو تقليل startup time و استهلاك الذاكرة الى حد يمكنه ان يكون مقاربا مماثلا له مع لغة C. الحقيقة ستعمل على LLVM.
هل تقصد قلت الفرق بين لغات البرمجة المختلفة أم للجافا فقط؟
جميع اللغات.
بالمناسبة ، جربت بايثون ايضا ، و اوقفت البرنامج بعد ٤٠٠ ثانية لأنه لم يظهر اي نتيجة ، و php ١٣٠
بينما C# على .net core حوالي ٦٠ ثانية.
Graal هو مترجم جديد للجافا و العديد من اللغات الأخرى يعمل على hotspot حاليا ، و أيضاً فيه ميزة ان تنشئ native image من الجافا او اللغات الأخرى ، يعني تصبح كما تترجم C++ الى لغة الآلة ،و لكن لجافا و اللغات المدعومة الأخرى.
هذه معلومة مهمة، هل تختصر لنا الخطوات لإصدار نُسخة تنفيذية exe من برنامج جافا باستخدام هذا المترجم
اذا كان لديك ملف .class او jar
الخطوة التي بعدها هي تشغيل الأمر
native-image <file name here>
او في حالة jar native-image -jar
طبعاً لتنصيب graal ، اسهل طريقة هي استخدام sdk man ، و بعدها تشغيل الأمر
sdk list java
ستجد العديد من JDK من ضمنها graal
هذا اﻷمر غير موجود في نظام لينكس
sdk list java
سوف أقوم بالبحث في النت عن طريقة تثبيتها إن وجدت وقت
هذا @معتز
لا يوجد سرعة للغة البرمجة، لغة البرمجة هي مجرد spec أما السرعة فهي للبيئة التي تعمل عليها اللغة و تترجمها إلى لغة الآلة/Bytecode، على سبيل المثال Cython أسرع من Python3 بعدة مرّات على الرغم من أنّ الـ syntax نفسه.
نعم كلامك صحيح، المقصود به هو الملف التنفيذي الناتج عن مترجم أو مفسر اللغة.
هل Cython تقوم بإنتاج ملفات تنفيذية للغة بايثون؟
نعم أعتقد ذلك، الفرق الوحيد بينها و بين python أنّها مكتوبة بـ C بينما Python تُكتب ب Python مؤخراً و من هنا يأتي فارق الأداء.