معرفی زبان برنامه نویسی ELENA
سه شنبه 11 آبان 1395در این مقاله با زبان برنامه نویسی ELENA که یک زبان شی گرا، همه منظوره و polymorphic است آشنا می شویم. کامپایلر مخصوص این زبان را به کار می گیریم و دستورات ELENA را همراه با توضیحات در این کامپایلر پیاده سازی می کنیم.
مقدمه
ELENA یک زبان همه منظوره، شی گرا و polymorphic است که دارای ویژگی late binding نیز هست. این زبان، دارای ویژگی هایی نظیر ارسال/دستکاری پیام ها، تغییر داینامیک شی ها ، یک موتور ترجمه و کامپایل مستقل و پشتیبانی از گروهی از شی ها می باشد.
در این مقاله، ما مفاهیم ابتدایی این زبان و چگونگی برنامه نویسی با این زبان را بررسی می کنیم.
ویژگی های زبان ELENA
-یک زبان شی گرای Polymorphic است
- از class mutation پشتیبانی می کند.
-ارسال پیام
-ماشین مجازی
-کامپایلر Command line 32-bit
-GUI IDE & Debugger
-Unicode support (utf-8)
- موتور/ مفسر بر پایه Script
-ترمینال ماشین مجازی
فایل اجرایی و همچنین source code پروژه را از آدرس های زیر می توانید دریافت کنید.
سایت رسمی:http://elenalang.sourceforge.net/
بر روی سایت GitHub :
https://github.com/ELENA-LANG/elena-lang
همچنین می توانید فایل ها را از لینک زیر نیز دانلود کنید:
https://sourceforge.net/projects/elenalang/files/v2.0.2/
کامپایلر ELENA
کامپایلر ELENA کاملا بر پایه ی ++C پیاده سازی شده است و برای کامپایل برنامه ها به وابستگی های خارجی مانند
Flex و Bison نیازی ندارد.... فقط کافی است Visual Studio 2015 داشته باشید.
برای این که بتوانید کامپایلر خودتان را build کنید، می توانید CMD را باز کنید، به پوشه اصلی elena بروید و دستور زیر را تایپ کنید:
recompile.bat
و یا از دستور زیر برای تولید فایل های release استفاده کنید:
vs_release.bat %cd%
زبان های برنامه نویسی دیگر
احتمالا هر فردی که درباره یک زبان جدید سخنی می شنود، اولین سوالی که به ذهنش می رسد این است که چرا از زبان های برنامه نویسی موجود استفاده نکنیم؟ چه لزومی دارد که این زبان را بپذیریم و از آن استفاده کنیم؟
اگر این سوال درباره زبان برنامه نویسی ELENA پرسیده شود، باید اینطور بگوییم که جواب، چندان ساده نیست. ELENA ممکن است به عنوان یک زبان آماتور و تازه کار در نظر گرفته شود که Source Code محدودی دارد و همچنین خطایابی آن نیز سطح پایین است. و همچنین ELENA یک زبان مفهومی است . این زبان برای این طراحی شده است که بتواند انواع مفاهیم را به چالش بکشاند و آن ها را امتحان کند.
گام های اولیه
این نکته بسیار مهم است که قبل از این که با یک زبان کاملا شی گرا شروع به کار کنیم، مفاهیم پایه ای آن را یاد بگیریم.
مفاهیم و Terminology پایه ی OOP
مفاهیم ابتدایی ELENA چیست؟ این مفاهیم که تا حدودی شبیه به مفاهیم ابتدایی SmallTalk هستند، عبارتند از :
-شی ها
-کلاس ها
-فیلدها
-منابع
-متدها
-پیام ها
-ارث بری ها
-دریافت کننده ها
-اتصال داینامیک
شی ها
یک شی ELANA بسیار شبیه یک شی NET. و یا ++C است. به ویژه این که هر شی در حافظه ذخیره می شود و فیلد ها و متدهای خاصی دارد، که می توانند به سایر شی ها اشاره کنند. هر شی، یک نمونه از یک کلاس است.
کلاس ها
هر شی، مشابه یک Struct در C و یا یک رکورد در Ada است، تنها تفاوت بین یک رکورد و یک شی این است که شی شامل فیلد هایی است که مشخص می کنند این شی متعلق به چه کلاسی است. در C++, C#, ELENA یا SmallTalk یک فیلد پنهان در هر شی وجود دارد . در ELENA این فیلد، dispatch table reference نامیده می شود و در داخل dispatch table اطلاعاتی راجع به کلاس وجود دارد. در زبان های دیگر، این فیلد پنهان، V-table pointer و یا dispatch table pointer نامیده می شود.
فیلد ها
فیلدها همچنین به عنوان instance variable ها نیز شناخته می شوند، و متغیر هایی هستند که در داخل یک کلاس تعریف شده اند. این متغیر ها می توانند با استفاده از متد ها مقداردهی شوند.
منابع
در ++C ، ما درباره ی "pointers" ها صحبت می کنیم، در حالی که در #C ما درباره ی منابع صحبت می کنیم. هر دوی این مفاهیم اساسا نام و منابع مشابهی دارند و هر دو ، تنها آدرس هایی در حافظه هستند. در ELENA ، ما از منابع استفاده می کنیم.
متد
متد مانند یک تابع است، با این تفاوت که به یک کلاس خاص اعمال می شود. همچنین ما می گوییم که یک متد "Invoked" شده است و یا یک شی "sent to" به یک شی دیگر شده است. در اینجا شی یک "reciever" نامیده می شود. هر متد برای دریافت یک شی، Invoked می شود. در ++C و یا #C ، دریافت کننده، "this object" نامیده می شود. ولی ELENA از این ساختار پیروی نمی کند.
متدها در ELENA مانند متدها در #C و ++C هستند، و تابع های عضو "member functions" نامیده می شوند. متدها ممکن است آرگومان هایی را بگیرند و یک نتیجه برگردانند. این بدنه متد ، لیستی از عبارت های اجرایی است.
پیام ها
یک تفاوت اساسی و مهم میان متدها و پیام ها وجود دارد. یک متد ، یک بدنه از کد است ، در حالی که یک پیام، چیزی است که فرستاده می شود. یک متد مشابه یک تابع است. در این روش، فرستادن پیام مشابه فراخوانی یک تابع است. عبارتی که متد را فراخوانی می کند، message Sending Expression نامیده می شود.
زبان ELENA یک تفاوت مشخص و واضح بین پیام و متد ایجاد می کند . اما در #C و یا ++C ممکن است گاهی اوقات، این مفاهیم گیج کننده شوند. یک message-sending expression یک پیام را به شی می فرستد. چگونگی پاسخ شی به آن پیام، بستگی به کلاسی دارد که شی به آن تعلق دارد. شی های از کلاس های مختلف به یک پیام مشابه به روش های مختلفی جواب می دهند.
برنامه "Hello World!"
یک شروع عالی برای زمانی که در حال یادگیری یک زبان برنامه نویسی جدید هستیم این است که برنامه مشهور "Hello world!" را بنویسیم.
برای این که بتوانیم اولین برنامه را ایجاد کنیم ، باید کامپایلر ELENA را دانلود کنیم. برای این کار می توانید از اینجا این کامپایلر را دریافت کنید.
بعد از اتمام دانلود، تمامی فایل ها را در پوشه مورد نظرتان قرار بدهید.
نکته مهم : شما نیاز دارید که پوشه ی bin را در مسیر سیستم خود قرار بدهید.
شما باید پوشه ی bin را در مسیر سیستم خود قرار دهید. . این کار برای این که بتوانید فایل های قابل اجرا تولید کنید ضروری است. همچنین اگر می خواهید بتوانید خطاهای زمان اجرا را ببینید، باید این کار را انجام بدهید.
بیایید شروع کنیم. ابتدا، نیاز داریم تا ELENA IDE را باز کنیم. برای این کار، می توانید در CMD ، عبارت Elide را تایپ کنید و یا فایل اجرایی elide را باز کنید.
بعد از این که IDE را باز کردید، یک پروژه جدید ایجاد خواهیم کرد . برای این کار به مسیر "File->New->Project" بروید، با این کار یک پنجره مطابق شکل زیر برای شما باز می شود:
هر فیلد چه معنایی دارد؟
Type: نوع برنامه ای است که شما می خواهید آن را ایجاد کنید.
فضای نام برنامه
یک checkbox که درباره ی منابع بارگذاری نشده به شما هشدار بدهد.
امکانات اضافی برای کامپایلر
نام خروجی برنامه
مسیر خروجی برنامه
فعال یا غیر فعال سازی debugger
آرگومان های Command line برای تست برنامه
برای این پروژه ، ما از تنظیمات زیر استفاده خواهیم کرد:
بعد از این که بر روی OK کلیک کنید، ما نیاز داریم تا یک source file جدید ایجاد کنیم. برای این کار ، از منوی بالای صفحه گزینه ی "File->Source file" را انتخاب کنید و یا از کلیدهای Ctrl+N استفاده کنید.
حالا می توانیم شروع به کدنویسی کنیم. کدی که برنامه ی Hello World را می سازد، به صورت زیر است:
#symbol program = [ system'console writeLine:"Hello World!". ].
بعد از این که این کد را نوشتید، نیاز دارید تا پروژه و Source Code را ذخیره کنید و سپس پروژه را build کنید.
درک کد
#symbol program =
به صورت پیش فرض، "#symbol program" نقطه ورودی برنامه است، ولی در صورت نیاز ، می توانید آن را تغییر بدهید.
system'console writeLine:"Hello World!".
در این خط از کد ، ما اطلاعات جالبی داریم :
1- "system" : یک فضای نام است، که می تواند خودش نیز بخش های مختلفی داشته باشد.
2-"console" : یک کلاس است
3- "writeLine" : یک متد است.
4-"Hello World!" : یک پارامتر از یک متد است.
5-".": خاتمه دهنده ی برنامه
این کد چه معنایی برای ما دارد؟
به این معنی است که ما یک پیام به متد WriteLine کلاس Console در فضای نام system با پارامتر "Hello World!" می فرستیم.
مانند زبان های برنامه نویسی دیگر، مثل C#, C++, Python ما می توانیم یک کلمه کلیدی "import" اضافه کنیم که این کار باعث کاهش حجم کدنویسی ما می شود.
بنابراین برنامه ی hello world با کلمه کلیدی "import " مانند زیر خواهد بود:
#import system. #symbol program = [ console writeLine:"Hello World!". ].
تنها مشکلی که ما با این برنامه دارین این است که نمی توانیم خروجی را بخوانیم. برای این کار ما نیاز به یک متد دیگر داریم که به دو صورت می تواند مورد استفاده قرار بگیرد.
راه اول:
#import system. #symbol program = [ console writeLine:"Hello World!". console readChar. ].
راه دوم
#import system. #symbol program = [ console writeLine:"Hello World!" readChar. ].
این راه دوم ، مناسب تر است، زیرا ELENA یک زبان برنامه نویسی کاملا شی گراست، و در این دستور به این شکل گفته می شود که: بعد از اجرای پیام Hello World ، پیام بعدی که readChar است را اجرا کن.
ایجاد متغیرها
مانند SmallTalk، نوعی ندارد، زیرا همه چیز به شکل یک شی است. بنابراین برای این که بتوانیم متغیر ایجاد کنیم، یک کلمه کلیدی خاص نیاز داریم:
#var
ساختار این کلمه کلیدی به صورت زیر است:
#var <variable name> := <Class instance>.
حالا برای تمرین، بیایید یک برنامه بسازیم که از کیبورد بتواند چیزی را بخواند.
می توانید این برنامه را در یک پروژه دیگر پیاده سازی کنید.
#import system. #import extensions. #symbol program = [ #var aNumber := console writeLine:"Type a number: " readLine:(Integer new). console writeLine:"You typed ":aNumber. console readChar. ].
خیلی ساده است، درست است؟
بنابراین در این مثال ، ما نیاز داریم تا یک فضای نام جدید اضافه کنیم.
یک متغیر می تواند شامل هر نوع شی ای باشد، به عنوان مثال :
#var x := Integer new. #var y := 0. #var k := system'calendar'Date new. #var n := k year. #var s := "Hello World". #var u := 0fffffh. #var l := 3.1415r. #var m := Real new:3.14r. #var j := true. #var h := false. #var xx := Boolean new. #var yy := Boolean new:true.
عملگر های شرطی ، if و else
عملگر های شرطی در ELENA به صورت زیر تعریف می شوند:
(<myCondition>) ? [ doSomething in case TRUE ] ! [ doSomehting in ELSE ].
کاربرد آن ها در یک مثال، به صورت زیر خواهد بود:
#import system. #symbol program = [ #var aTrue := true. #var aFalse := false. (aTrue && aFalse) ? [ console writeLine:"aTrue && aFalse is: ":(aTrue && aFalse). ] ! [ console writeLine:"aTrue && aFalse is: ":(aTrue && aFalse). ]. (aTrue || aFalse) ? [ console writeLine:"aTrue || aFalse is: ":(aTrue || aFalse). ] ! [ console writeLine:"aTrue || aFalse is: ":(aTrue || aFalse). ]. console readChar. ].
برای این که عملگر های شرطی و کاربرد آن ها برای شما ساده تر شوند، آن ها را در یک برنامه ساده پیاده سازی می کنیم. در این سیستم ازتعداد زیادی متغیر شرطی و عبارت های شرطی استفاده می کنیم:
#import system. #import extensions. #import system'culture. #symbol program = [ console writeLine:"Hi!! :)". #var aYourName := console writeLine:"Whats your name ?" readLine. console writeLine:"How old are you ?". #var aYourAge := console readLine:(Integer new). #var aNumberOfChildrens := 0. ((aYourAge >= 0) && (aYourAge <= 10)) ? [ console writeLine:"You're still very young!!". ] ! [ ((aYourAge >= 11) && (aYourAge <= 20)) ? [ console writeLine:"Adolescence, come a lot of people angry?". ] ! [ ((aYourAge >= 21) && (aYourAge <= 30)) ? [ console writeLine:"Do you already have children ? ( yes/no )". #var aHaveChildren := console readLine. ((aHaveChildren toLower &locale:currentLocale) == "yes") ? [ aNumberOfChildrens := console writeLine:"Cool!! how many kids do you have ?" readLine:(Integer new). ]. ] ! [ ((aYourAge >= 31) && (aYourAge <= 40)) ? [ console writeLine:"The first 40 years of childhood are the most difficult !!!". ] ! [ ((aYourAge >= 41) && (aYourAge <= 50)) ? [ console writeLine:"Life begins at 40!". ] ! [ ((aYourAge >= 51) && (aYourAge <= 60)) ? [ console writeLine:"Enjoy your LIFE !!!". ] ! [ (aYourAge >= 61) ? [ console writeLine:"You are at the age to enjoy and relax !!". ]. ]. ]. ]. ]. ]. ]. console readChar. ].
ممکن است بپرسید چرا کد را به این اندازه طولانی و دشوار کرده ایم، در حالی که می توانستیم به سادگی از elseif استفاده کنیم.
پاسخ این است که در ELENA هیچ گونه دستور elseif ای وجود ندارد و شما مجبورید با عبارت های پیچیده برای پیاده سازی این دستور، دست و پنجه نرم کنید.
حلقه ها
مانند سایر زبان های برنامه نویسی ، ELENA از حلقه ها پشتیبانی می کند ولی بزرگ ترین تفاوتی که در مقایسه با سایر زبان ها دارد این است که فقط یک راه برای پیاده سازی حلقه ها وجود دارد. این راه ، استفاده از کلمه کلیدی به صورت زیر است :
#loop(<condition>) ? [ /* true conditiion */ ] ! [ /* false condition */ ].
با استفاده از همین کلمه کلیدی ، تمامی اموری که نیاز به حلقه دارند، می توانند پیاده سازی شوند.
برای این که بررسی ساده تری بر روی نحوه استفاده از حلقه ها داشته باشیم، آن ها را در یک مثال پیاده سازی می کنیم.
#import system. #symbol program = [ #var aArray := Array new:200. #var aI := 0. #loop (aI < aArray length) ? [ aArray@aI := aI * 10. aI := aI + 1. ]. aI := 0. #loop (aI < aArray length) ? [ console write:("At index " + (aI literal) + " has the value:"). console writeLine:(aArray@aI). aI := aI + 1. ]. console readChar. ].
Symbol
یک symbol نام یک عبارت است که می تواند برای تعریف و مقداردهی اولیه شی ها مورد استفاده قرار بگیرد.
#symbol N = 1. #symbol TheClass = DerivedClass new &field1:N &field2:N.
کلاس ها، متدها و فیلدها
ELENA یک زبان برنامه نویسی شی گرا است . برای ایجاد یک برنامه، نیاز داریم تا کلاس ها و symbol های جدید ایجاد کنیم.
یک کلاس، داده ها را encapsulate می کند تا بعدا دسترسی به آن ها امکان پذیر باشد. در اغلب موارد، دسترسی مستقیم به داده های یک کلاس امکان پذیر نیست. معمولا فیلد ها به یک کلاس دیگر ارجاع داده شده اند و این روند ادامه دارد تا به کلاس های "Primitive" می رسیم که به عنوان داده خام در نظر گرفته می شوند.
کلاس ها ، درخت ارث بری را تشکیل می دهند. درخت یک super class معمولی است. ELENA از ارث بری های چندگانه پشتیبانی نمی کند، اگرچه می تواند عمل ارث بری را با استفاده از dispatch handler انجام بدهد. زمانی که کلاس پدر آماده ارث بری نباشد، به صورت خودکار، ارث بری از system'Object انجام می شود.
یک نمونه از کلاس می تواند با کمک متدهای خاصی ساخته شود(constructors). یک constructor اغلب برای مقدار دهی اولیه به فیلدهای کلاس استفاده می شود. نوع خاصی از کلاس ها وجود دارند که constructor ندارند و می توانند مستقیما مورد استفاده قرار بگیرند.
برای درک بهتر مفهوم کلاس ، آن را در یک مثال پیاده سازی می کنیم.
به عنوان اولین تمرین، یک کلاس ساده ایجاد می کنیم.
#import system. #import extensions. #class MyFirstClass { #constructor new [ console writeLine:"MyFirstClass instancied!!! ehhhhhhh!!". ] } #symbol program = [ #var myFirstClass := MyFirstClass new. console readChar. ].
زمانی که شما برنامه را اجرا کنید، جمله زیر را در کنسول به عنوان خروجی خواهید دید:
MyFirstClass instancied!!! ehhhhhhh!!
بنابراین حالا که روش ساخت کلاس ها را یاد گرفتیم، چند متد را در این کلاس اضافه می کنیم و یک Constructor نیز اضافه می کنیم که دو آرگومان داشته باشد و این دو پارامتر در دو فیلد مجزا ذخیره شوند.
ابتدا، ما یک Constructor ایجاد می کنیم که پارامتر های جدیدی داشته باشد که کد آن در نهایت، به صورت زیر خواهد بود :
#import system. #import extensions. #class MyFirstClass { #field field1. #field field2. #constructor new [ console writeLine:"MyFirstClass instancied!!! ehhhhhhh!!". ] #constructor new &myFirstParameter:aParameter1 &mySecondParameter:aParameter2 [ console writeLine:"MyFirstClass instancied!!! with 2 parameters!!". console writeLine:"My first parameter.: ":(aParameter1 literal). console writeLine:"My second parameter: ":(aParameter2 literal). field1 := aParameter1. field2 := aParameter2. ] } #symbol program = [ #var myFirstClass := MyFirstClass new. #var myFirstClassWith2Parameters := MyFirstClass new &myFirstParameter:500 &mySecondParameter:200. console readChar. ].
توجه کنید که در #symbol program یک متغیر جدید ایجاد کرده ایم تا نمونه جدید کلاس را در خودش ذخیره کند که به وسیله همان دو پارامتر مقدار دهی شده است.
حالا برای استفاده از این دو پارامتر، متدهایی را پیاده سازی می کنیم.
#class MyFirstClass { #field field1. #field field2. #constructor new [ console writeLine:"MyFirstClass instancied!!! ehhhhhhh!!". field1 := 0. field2 := 0. ] #constructor new &myFirstParameter:aParameter1 &mySecondParameter:aParameter2 [ console writeLine:"MyFirstClass instancied!!! with 2 parameters!!". console writeLine:"My first parameter.: ":(aParameter1 literal). console writeLine:"My second parameter: ":(aParameter2 literal). field1 := aParameter1. field2 := aParameter2. ] #method addTwoNumbers [ ^(field1 + field2). ] #method addTwoNumbers &number1:aNumber1 &number2:aNumber2 [ ^(aNumber1 + aNumber2). ] #method addTwoNumbersAndPrintIt [ #var addResult := self addTwoNumbers. console writeLine:"Result of ":(field1 literal):"+":(field2 literal):"=":addResult. ] #method addTwoNumbersAndPrintIt &number1:aNumber1Argument &number2:aNumber2Argument [ #var addResult := self addTwoNumbers &number1:aNumber1Argument &number2:aNumber2Argument. console writeLine:"Result of ":(aNumber1Argument literal):"+":(aNumber2Argument literal):"=":addResult. ] }
حالا ما 4 متد داریم، و می خواهیم از این متدها استفاده کنیم.
یک استفاده ی ساده از این کلاس می تواند به صورت زیر باشد:
#symbol program = [ #var myFirstClass := MyFirstClass new. #var myFirstClassWith2Parameters := MyFirstClass new &myFirstParameter:500 &mySecondParameter:200. // Working just with the myFirstClassInstance myFirstClass addTwoNumbersAndPrintIt. myFirstClass addTwoNumbersAndPrintIt &number1:20 &number2:20. console writeLine:"---------------------------------------". // Working just with the myFirstClassWith2Parameters myFirstClassWith2Parameters addTwoNumbersAndPrintIt. myFirstClassWith2Parameters addTwoNumbersAndPrintIt &number1:15 &number2:320. console readChar. ].
یکی از اصول اولیه برنامه نویسی شی گرا، خاصیت ارث بری بین کلاس ها است، پس بیایید دو کلاس ایجاد کنیم که یکی از دیگری ارث بری کند.
#import system. #import extensions. #class MyFirstBaseClass { #field theField1. #field theField2. #constructor new [ theField1 := "". theField2 := "". ] #constructor new &fieldBaseClass1:aField1 [ console writeLine:"fieldBaseClass1 = ":aField1. theField1 := aField1. theField2 := "". ] #constructor new &fieldBaseClass1:aField1 &fieldBaseClass2:aField2 [ console writeLine:"fieldBaseClass1 = ":aField1. console writeLine:"fieldBaseClass2 = ":aField2. theField1 := aField1. theField2 := aField2. ] #method printFields [ console writeLine:(self field1). console writeLine:(self field2). ] #method field1 = theField1. #method field2 = theField2. } #class MyFirstDerivedClass :: MyFirstBaseClass { #constructor new [ console writeLine:"Constructor of MyFirstDerivedClass called with no parameters". ] #constructor new &field1:aField1 <=(new &fieldBaseClass1:(aField1 + " -- Called from DerivedClass")) [ console writeLine:"Constructor of MyFirstDerivedClass called with 1 parameters". console writeLine:"field1 = ":aField1. ] #constructor new &field1:aField1 &field2:aField2 <=(new &fieldBaseClass1:(aField1 + " -- Called from DerivedClass") &fieldBaseClass2:(aField2 + " -- Called from DerivedClass")) [ console writeLine:"Constructor of MyFirstDerivedClass called with 2 parameters". console writeLine:"field1 = ":aField1. console writeLine:"field2 = ":aField2. ] } #symbol program = [ #var myFirstDerivedClassInstance := nil. #var numberOfArgsToInitInInstance := 0. #var continueLoop := true. #loop (continueLoop) ? [ numberOfArgsToInitInInstance := console writeLine:("Enter with how much variables you want to use in instance init ? (0/1/2)") readLine:(Integer new). ((numberOfArgsToInitInInstance >= 0) && (numberOfArgsToInitInInstance <= 2)) ? [ continueLoop := false. ]. ]. // This is a 'swith'... numberOfArgsToInitInInstance => 0 ? [ myFirstDerivedClassInstance := MyFirstDerivedClass new. ] 1 ? [ myFirstDerivedClassInstance := MyFirstDerivedClass new &field1:"Argument1 from #symbol program". ] 2 ? [ myFirstDerivedClassInstance := MyFirstDerivedClass new &field1:"Argument1 from #symbol program" &field2:"Argument2 from #symbol program". ] ! [ console writeLine:"invalid option...". ]. myFirstDerivedClassInstance printFields. console readChar. ].
برای چه مواردی می توانیم از زبان برنامه نویسی ELENA استفاده کنیم؟
این اولین سوالی است که به ذهن افراد می رسد، زمانی که با یک زبان برنامه نویسی جدید روبرو می شوند.
بسیار خب ما از ELENA برای ساخت و توسعه برنامه های تجاری استفاده می کنیم . اگر بخواهیم شرکت های بزرگی که از این زبان برای اهداف تجاری شان استفاده می کنند را نام ببریم، می توانیم بانک هایی نظیر Ford, GM, (Mercedes) Fundo Estrela, (Citroën and Peugeot) PSA Bank, (Fiat, Chrysler و... را نام ببریم.
امیدواریم این مقاله بتواند در درک این زبان برنامه نویسی به شما کمک کند.
- برنامه نویسان
- 2k بازدید
- 5 تشکر