زبان های برنامه نویسی

۷ مطلب در آذر ۱۳۹۱ ثبت شده است

در این‌جا می‌خواهیم کارایی زبان‌های اسکریپتی را مقایسه کنیم. در این مقایسه، زبان‌های مطرح اسکریپتی را با زبان‌های غیر اسکریپتی مانند ++C مقایسه می‌کنیم. این مقایسه‌ها روی یک الگوریتم روی زبان‌های متفاوت روی یک کامپیوتر Intel® Q6600® quad-core 


 با ورودی یکسان اجرا شده است. بناربراین تنها وجه تمایز، زبان پیاده‌سازی است. (طبیعتا اگر غیر از این بود مقایسه از اعتبار ساقط می‌شد.) سیستم عامل این کامپیوتر نیز اوبونتوی x64 است. 
 
اولین الگوریتمی که بررسی می‌کنیم، مربوط است به تحلیل اجسام آسمانی هنگامی که در حال حرکت‌اند. در این تست، همان طور که انتظار می رود ++C سریعتر از بقیه است. در جدول زیر می‌توانیم زبان‌های مهم مورد بحث را ببینیم. در این تست، عملیات اعشاری به کار رفته است.
 
زبان زمان اجرا(ثانیه) حافظه(کیلو بایت) طول کد(بایت) توزیع روی پردازنده‌ها
++C ۱۰.۷۹ ۸۲۴ ۱۷۴۹ ۰٪      ۰٪      ۰٪      ۱۰۰٪
Java ۲۲.۴۹ ۱۷۲۶۰ ۱۴۲۴ ۰٪      ۰٪      ۱۰۰٪   ۰٪
Racket ۵۵.۸۳ ۲۶۵۲۸ ۱۶۸۹ ۰٪      ۰٪      ۰٪      ۱۰۰٪
PHP ۱۱ دقیقه ۳۲۴۸ ‍۱۰۸۲ ۰٪      ۰٪      ۱۰۰٪   ۰٪
Python ۱۶ دقیقه ۶۲۴۸ ۱۱۸۱ ۰٪      ۲۴٪     ۴۶٪    ۳۰٪
Perl ۱۶ دقیقه ۲۶۹۲ ۱۴۰۱ ۰٪      ۰٪      ۱۰۰٪   ۰٪
Ruby ۲۴ دقیقه ۴۸۹۲ ۱۱۳۷ ۰٪      ۰٪      ۰٪      ۱۰۰٪
 
در این جا یک الگوریتم محاسباتی سنگین را می‌بینیم که همان طور که انتظار می‌رود ++C و Java به ترتیب در آن اول و دوم هستند. البته از نظر حافظه، می‌دانیم که جاوا بسیار اسراف کار است که در این جدول نیز مشخص است.

تست بعدی مربوط به محاسبه‌ی ارقام عدد پی است. این تست یک تست الگوریتمی است. در این تست از اعداد اعشاری استفاده‌ای نشده است و محاسبات فقط با اعداد صحیح صورت گرفته است.

زبان زمان اجرا(ثانیه) حافظه(کیلو بایت) طول کد(بایت) توزیع روی پردازنده‌ها
++C ۲.۳۰ ۱۶۴۴ ۶۸۲ ۰٪      ۰٪      ۰٪      ۱۰۰٪
Java ۴.۴۸ ۶۴۸۱۲ ۱۸۲۶ ۷۳٪    ۴۳٪    ۴۰٪   ۷۳٪
Racket  ۲.۳۶ ۲۴۰۸۸ ۱۱۲۲ ۰٪      ۰٪      ۱٪      ۱۰۰٪
PHP ۳.۵۹ ۴۶۶۸ ‍۵۳۷ ۰٪      ۰٪      ۱٪     ۱۰۰٪
Python  ۲.۴۴ ۷۰۲۸ ۲۵۵ ۰٪      ۰٪      ۱۰۰٪    ۱٪
Perl ۴.۴۷ ۴۰۱۲ ۲۶۱ ۰٪      ۰٪      ۵٪     ۹۵٪
Ruby ۸.۹۲ ۱۲۷۰۴ ۲۴۲ ۰٪      ۰٪      ۱۰۰٪    ۰٪

در این تست نیز مشاهده می‌شود که Java و Racket بیشترین حافظه را مصرف می‌کنند. تنها نکته‌ی شگفت‌انگیزی که وجود دارد پیشی گرفتن PHP از Java است در این تست!

تست بعدی، مربوط به برنامه‌سازی هم‌روند است. در این تست ۵۰۳ thread ساخته خواهد شد که به هم به طور حلقه‌ای متصل می‌شوند (به هم reference خواهند داشت). سپس با هم بازی «هپ» را انجام می‌دهند به این صورت که یک عدد را به اولین thread می‌دهیم و سپس این thread این عدد را یکی کم می‌کند و به بعدی می‌دهد و الی آخر. هنگامی که این عدد صفر شود برنامه خاتمه می‌یابد. این تست زمان جابه‌جایی میان threadها را مشخص می‌کند.

زبان زمان اجرا(ثانیه) حافظه(کیلو بایت) طول کد(بایت) توزیع روی پردازنده‌ها
++C ۲۵۹.۹۱ ۴۶۰۴ ۵۸۸ ۳۰٪     ۳۰٪     ۶٪      ۶٪
Java ۶ دقیقه ۲۸۹۵۰۰ ۵۳۰ ۴۴٪    ۲٪     ۲٪    ۴۴٪
Racket ۱۷۵.۴۶ ۶۷۰۴۸ ۲۶۲ ۰٪      ۰٪      ۱۰۰٪    ۰٪
PHP --- --- ‍--- ---
Python ۶ دقیقه ۱۰۳۷۶ ۲۸۸ ۴۹٪     ۱٪      ۱٪      ۴۹٪
Perl ۹ دقیقه ۷۰۲۳۶۰ ۴۸۹ ۲۸٪      ۲۸٪     ۲۷٪    ۲۷٪
Ruby ۱۹ دقیقه ۱۷۲۳۶ ۲۱۵ ۵۸٪     ۶٪      ۱۱٪     ۵۸٪

نکته‌ی جالب این است که Racket عملا برنامه را به صورت موازی اجرا نمی‌کند!

تست آخر روی زمان اجرا و حافظه‌ی مورد استفاده‌ی برنامه‌های نوشته شده تحت این زبان‌ها است برای انجام کارهای مربوط به پردازش متن. همان طور که می‌توان انتظار داشت، زبانی مانند Perl که به هدف انجام پردازش روی متن طراحی شده‌است، باید در این حوزه بسیار موفق ظاهر شود.


زبان زمان اجرا(ثانیه) حافظه(کیلو بایت) طول کد(بایت) توزیع روی پردازنده‌ها
++C ۴.۱۱ ۱۶۳۹۵۶ ۶۹۵ ۳۶٪     ۷۶٪     ۲۳٪     ۲٪
Java ۶.۳۹ ۶۲۱۷۱۲ ۱۴۱۰ ۸۷٪    ۸۷٪    ۸۶٪   ۹۶٪
Racket ۴۰.۵۰ ۶۴۰۲۴۰ ۵۲۷ ۰٪      ۰٪      ۱۰۰٪      ۰٪
PHP ۲۶.۷۳ ۲۲۳۹۹۲ ‍۴۵۹ ۰٪      ۰٪      ۱۰۰٪   ۰٪
Python ۱۲.۸۸ ۲۵۵۷۲۴ ۴۷۸ ۴۱٪     ۳۳٪     ۹۹٪   ۳۲٪
Perl ۱۰.۴۰ ۱۳۹۶۷۶ ۵۲۷ ۶۹٪     ۷۱٪     ۷۱٪    ۹۰٪
Ruby ۱۳.۹۹ ۲۷۹۰۹۲ ۵۰۱ ۴۱٪     ۴۰٪     ۴۱٪   ۱۰۰٪


همان طور که دیده می‌شود Perl با وجود این که یک زبان اسکریپتی است در این حوزه در حدود جاوا کارایی دارد.


منابع:
۰ نظر موافقین ۰ مخالفین ۰ ۰۴ آذر ۹۱ ، ۲۳:۱۵
نیما حمیدی

پایتون یک زبان آسان برای  یاد گرفتن و برای برنامه نویسی قدرتمند می باشد. داده ساختار های کارای سطح بالایی دارد که برای برنامه نویسی object-oriented مناسب می باشند. syntax  زیبا و  dynamic typing  و اینکه این زبان یک زبان مفسری است باعث می شود  این زبان برای نوشتن script و application های سریع مناسب باشد. پایتون یک زبان قابل گسترش می باشد به این معنی که اگر لازم باشد یک تکه کد خیلی سریع باشد می توان آن را با c یا  ++c  نوشت و آن را به برنامه ای که با زبان پایتون نوشته شده ترکیب کرد.

همچنین می توان از آن برای نوشتن script در زبان های دیگر استفاده کرد.


تاریخچه 

پیاده سازی زبان پایتون توسط   Guido van RossumدرCWI  در هلند، سال 1989 آغاز شد. این زبان error handling  بالا داشته .نویسنده ی اصلی این زبان Rossum  شناخته شد و نقش مرکزی این فرد در تعیین مسیر پایتون در لقبی که جامعیت پایتون به او دادند مشخص است که این لقب Benevolent Dictator for Life     می باشد.2.0 python  در 16 oct  سال 2000 با ویژگی های بزرگی مثل garbage collector و پشتیبانی Unicode .

 Rossum  در سال 1991  کد خود را با ورژن 0.9.0 انتشار عمومی داد .


انواع تایپ های موجود در پایتون


در پایتون همانند جاوا تایپ string وجود دارد و عملیات مختلفی می توان روی آن انجام داد. به طور مثال:

>>> 'machine'.upper()
'MACHINE'
>>> 'HELP'.lower()
'help'
>>> len('Help')
4 

انواع تایپ های built-in در پایتون :

1-list : در لیست ها اندیس منفی هم می توانیم داشته باشیم. و داده های داخل لیست می توانند انواع مختلفی داشته باشند حتی می توان لیست ای از لیست ها ایجاد کرد.

مثال ای از لیست و عملیات روی آن:

>>> lstOfLsts = [['a','b','c'],[1,2,3],['one','two','three']] 
>>> lstOfLsts[1][2] 
3
>>> lstOfLsts[0].pop()
'c'
>>> lstOfLsts
[['a', 'b'],[1, 2, 3],['one', 'two', 'three']]


2-tuples :  این داده ساختار شبیه لیست است با این تفاوت که فقط در هنگام ایجاد می توان به  آن  مقدار داد و مقدار آن غیر قابل تغییر می باشد. در syntax  هم تفاوت ای که دارند این است که در هنگام تعریف از پرانتز به جای براکت استفاده می شود.

>>> pair = (3,5)
>>> pair[0]
3
>>> x,y = pair
>>> x
3
>>> y
5 
>>> pair[1] = 6
TypeError: object does not support item assignment

3-set : در set عضو تکراری  نگه داشته نمی شود و syntax آن به صورت زیر است: 

>>> shapes = ['circle','square','triangle','circle']
>>> setOfShapes = set(shapes)
>>> setOfShapes 
set(['circle','square','triangle']) 

4- dictionary :  داده ساختاری است که  یک نوع( object (key را نوع دیگری (value)  نظیر  می کند. key  باید یک type تغییز ناپذیر باشد ( string - tuple - number) باشد اما (value) هر نوع داده ای می تواند باشد.

>>> studentIds = {'knuth': 42.0, 'turing': 56.0}
>>> studentIds['turing']
56.0
ساختار های کنترلی


1-if 

در پایتون هم if یکی از ساختار های کنترلی محسوب می شود و همچنین از آن به عنوان switch -case  هم استفاده می شود.

کلمه ی کلیدی elif مختصر شده ی else if می باشد که مثال زبر استفاده از آن را نشان می دهد.

>>> x = int(raw_input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...      x = 0
...      print 'Negative changed to zero'
... elif x == 0:
...      print 'Zero'
... elif x == 1:
...      print 'Single'
... else:
...      print 'More'
...
More

2- for 

for  در پایتون با زبان های دیگر کمی متفاوت می باشد . در for  ،  می توان  در iteration  آن از item هایی از هر نوع استفاده کرد.مثلا لیست ای از string .

>>> for w in words[:]:  # Loop over a copy of the entire list.
...     if len(w) > 6:
...         words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']


برخی از ویژگی های زبان پایتون


1-lambda function 

زبان پایتون اجازه تعریف function های بی نام در زمان اجرا می دهد. این امکان را با دستوری به نام lambda  فراهم می کند. lambda  در زبان پایتون دقیقا مثل lambda در  زبان های functional  نمی باشد.

قطعه کد زیر تفاوت lambda و function  معمولی را نشان می دهد.

>>> def f (x) : return x**2;
...
>>> print f(8)
64
>>>     
>>> g = lambda x : x**2
>>>
>>> print g(8)
64

2- for 


 همان طور که در مثال مشخص است این تابع و lambda مثل هم عمل می کنند . ولی در    return ، lambda   

وجود ندارد و همیشه در lambda یک statement وجود دارد که برگرداننده می شود.


3- multi -inheritance 

 در زبان پایتون بر خلاف جاوا که فقط یک کلاس می تواند extend  از یک کلاس باشد ، در اینجا یک کلاس می تواند از چند کلاس extend   شده باشد.

به طور مثال:

class First(object):
    def __init__(self):
        print "first"

class Second(object):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        super(Third, self).__init__()
        print "that's it"

 4- fixed format  

پایتون را می توان تقریبا در دسته ی زبان های fixed format   قرار داد البته به طور کامل fixed format  نیست چون اگر space  در بعضی موارد کم یا زیاد شود error  نمی گیرد ولی  با استفاده از tab  به جای کروشه دستور های موجود در for  یا  if  را مشخص می کند و وجود tab  برای این کار ضروری است .


5- اضافه کردن field 

 در پایتون این اجازه به برنامه نویس داده  می شود که یک کلاسی که قبلا تعریف کرده در جایی دیگر به یک  instance  از آن یک item  دیگر اضافه کند.

class Student:
   pass

std = Student ()
std.name = "John Smith!"

اگر نام این field در زمان اجرا مشخص می شود:

field_name = ... #read from input
setattr (std, field_name, 5);
۲ نظر موافقین ۰ مخالفین ۰ ۰۴ آذر ۹۱ ، ۱۷:۰۷
فهیمه هاجری


زبان های اسکریپتی جزو زبان های 
interpreter ای هستند و کامپایل نمی شوند.از زبان های اسکریپتی برای نوشتن برنامه هایی که می خواهد به طور اتوماتیک یک  سری دستور که باید توسط برنامه نویس به صورت interactive انجام شود را استفاده می شود.

از این زبان ها برای نوشتن صفحات وب، نوشتن shell در سیستم عامل.

این زبان ها از روی زبان های برنامه نویسی نوشته شده اند. در واقع نمونه های کوچکی از زبان های برنامه نویسی هستند. این زبان ها برای نوشتن برنامه ها از صفر طراحی نشده اند و برای ترکیب کردن component  ها استفاده می شوند.


برخی ویژگی های این زبان ها

1-      سادگی syntax :برای استفاده ی راحت  و سریع برنامه نویس از syntax  های ساده ای که خیلی سریع میتوان آنها را فهمید استفاده می شود.

2-      پیاده سازی interface آسان برای ویژگی های سیستم عامل

3-      ساختار نسبتا سست : مثلا نمی توان از زبان جاوا به راحتی برای نوشتن برنامه های اسکریپتی استفاده کرد چون قوانین زیادی برای کلاس ها در نظر گرفته شده ولی زبان های اسکریپتی میتوانند در زمان اجرا به فایل ها مراجعه کنند و یک قطعه برنامه را به برنامه ی خود اضافه کنند.

 انواع زبان های اسکریپتی

1 - اسکریپت های گرافیکی  : این زبان ها با به وجود آمدن interface  های گرافیکی ایجاد شدند.این زبان ها در تعامل با منوهای گرافیکی ویندوز و دکمه های مختلف موجود در ویندوز می باشند،و با کلیک کاربر بر روی یک منو  مثل کاربر عمل میکنند و دستورات را یک به یک اجرا میکنند.بعضی از این زبان ها که عملیات کلیک بر روی یک گزینه را شبیه سازی می کنند ماکرو نامیده می شوند.
این زبان ها به طور کلی می توانند برای  کنترل هر برنامه گرافیکی استفاده شوند، برای این کار هم برنامه باید زبان اسکریپتی را پشتیبانی کند هم سیستم عامل مربوطه.

2 - زبان های اسکریپتی برای برنامه های خاص منظوره: این زبان ها متناسب با یک  برنامه خاص که دارای ویژگی منحصر به فرد هستند استفاده می شود. به  طور مثال خیلی از بازی های کامپیوتر زبان اسکریپتی مخصوص به خود را دارند. یکی از این زبان ها Emacs Lisp است که ویژگی های زبان Lisp را دارد و برای(Emacs (text editor  طراحی شده است.


3-زبان هایی برای پردازش در متن : پردازش رکورد های متنی یکی از قدیمی ترین استفاده های زبان های اسکریپتی است. اسکریپت هایی که برای tool هایی UNIX نوشته شده (AWK,sed) و برای grep که با فایل های متنی در ارتباط است.

4-زبان های پویای همه منظوره: این زبان ها در ابتدا به صورت زبان های اسکریپتی همه منظوره بودند ولی بعدها به سمت  کنترل زبان هایی رفتند که داینامیک بودند و در زمان اجرا امکان ایجاد تغییر در آنها وجود داشت. 

5- زبان های افزونگی / توکار: می توان با استفاده از این زبان ها اسکریپت ها را در هر زبان برنامه نویسی و هر برنامه ی نرم افزاری تعبیه کرد. به طور مثال برنامه نویس های زبان C از "hook" برای اینکه کنترل را به زبان اسکریپتی بدهد استفاده می کنند. برنامه هایی مثل Adobe Flash   اجازه ی استفاده از اسکریپت هایی که از استاندارد ECMAScript  را می دهند .

lمثال هایی از زبان های اسکریپتی که در قسمت های بعد توضیح داده می شوند عبارتند از: PhP - java script - Python  Perl


۱۹ نظر موافقین ۰ مخالفین ۰ ۰۴ آذر ۹۱ ، ۱۷:۰۶
فهیمه هاجری

php یک زبان open-source و اسکریپتی برای هدف های عمومی می باشد که اساسا برای تولید صفحات داینامیک وب استفاده می شود. php یکی از اولین زبان های server-side scripting (تکنیک استفاده از script ها به صورت نهفته در کد های HTML ) می باشد .

کد ها به وسیله ی وب سرور با php processor تفسیر می شوند و صفحات وب را نتیجه می دهند.

زبان php برای توسعه ی وب سرور ها ، و همچنین به صورت shell مستقل در خیلی از سیستم عامل ها و platform های بدون تغییر.

نرم افزار هایی که از php استفاده می کنند عبارت اند از : Wordpress- MediaWiki -Joomla - Drupal

php اساسا کوتاه شده ی عبارت Personal Home Page می باشد ولی آن را به php را به PHP Hypertext Preprocessor هم نسبت می دهند.

سادگی استفاده از زبان php و شباهت آن به زبان های C و Perl باعث شده اغلب برنامه نویسان با تجربه در کوتاه ترین زمان ممکن برنامه های کامل و قدرتمندی ایجاد کنند.

می توان از PHP-GTK برای طراحی برنامه هایی با ظاهر گرافیکی(GUI) استفاده کرد.


تاریخچه

توسعه ی php در سال 1994 شروع شد توسط برنامه نویس ای به نام Rasmus lerdof . یک مجموعه از اسکریپت های پرل را نگهداری صفحات شخصی خود به وجود آورد.اسکریپت ها وظایفی مثل نمایش resume او و یا ثبت ترافیک web page اش.

او این اسکریپت ها را مثل زبان C به صورت باینری بازنویسی کرد و آن را گسترش داد که بتوانند از web form ها استفاده کنند و با پایگاه داده ارتباط داشته باشند و آن را PHP/FI نامیدند. از PHP/FI برای تولید آسان و پویای وب اپلیکیشن استفاده می شد. lordof توسعه ی php را با ورژن 1.0 در سال 1995 رها کرد تا آن را بهبود ببخشد و اشکالات آن را برطرف کند و این کار باعث به وجود آمدن ورژن دوم php شد که هم اکنون هم استفاده می شود. ترکیب آن مثل پرل بود اما ساده تر ، پایدار تر و محدود تر .

Zeev Suraski و Andi Gutmans دو توسعه دهنده فناوری IIT در اسرائیل بودند که پارسر را در سال 1997 دوباره نوشتند و اساس php3 را تشکیل دادند و نام آن را به دوباره به php تغییر دادند.این دو نفر گروهی را برای بازنویسی پی اچ پی تشکیل دادند و در سال 1999 Zend Engine را تولید کردند.

در۲۲ ماه می۲۰۰۰ پی اچ پی ۴ که توسط موتور زند روی کار آمده بود منتشر شد. در۱۳ ژوئیه ۲۰۰۴ پی اچ پی ۵ که توسط ماشین Zend2 نیرو گرفته بود منتشر شد. پی اچ پی ۵ دارای ویژگی‌هایی مانند پشتیبانی از زبان شی‌ٴ گرا (برای پایگاه داده) و وسعت بسیار زیاد در کارایی‌اش شده بود. پی اچ پیی که اخیرا توسط گروه پی اچ پی منتشر شده نسخه ۴ آن است. در آگوست ۲۰۰۸ این نسخه به ۴٫۴٫۹ توسعه یافت.


امنیت


حدود 30% از آسیب پذیزی هایی که در دیتابیس جهانی آمده است به php منتسب می شود.دلیل عدم رعایت قوانین برنامه نویسی می باشد .در واقع درصد خلیلی کمی از این مشکل به اصل زبان و تکنیک های امنیتی زبان بر می گردد(تقریبا 1% از کل).

خیلی از زبان ها مثل پرل و روبی از tain checking برای چک کردن اینکه در فایل های ورودی اشتباه رخ داده است یا نه استفاده می کنند.از چنین ویژگی هایی برای زبان پی اچ پی استفاده شد در گذشته اما همه ی آنها رد شد.

PHPIDS امنیت را به برنامه های php اضافه می کند و از آن در برابر نفوذ محافظت می کند.PHPIDS از برنامه در مقابل دستورات SQL، دستورات header ،اجرای فایل های از را دور و ... محافظت می کند.


syntax


مفسر پی اچ پی فقط کد هایی را اجرا می کند که در جداکننده قرار دارند .این جداکننده در حالت کلی برای شروع php?> , برای بستن آن از <? استفاده می شود.حالت کوتاه تر آن به صورت ?> و <؟ استفاده می شود اما این حالت حالت portable بودن فایل ها را کم می کند پس استفاده از حالت کلی بیشتر توصیه می شود.

از /* */ comment کردن یک قطعه کد و از // یا # برای comment کردن یک خط استفاده می شود.

کلمات کلیدی در این زبان مثل بقیه ی زبان های سطح بالا می باشد.


یک برنامهٔ پی‌اچ‌پی می‌تواند قسمتی از یک برنامهٔ (HTML) باشد. مثلاً در برنامهٔ زیر


<code>
<pre>
<html>
<head>
<title>Azmayesh</title>
</head>

<body>
<?php echo 'Hello world!'; ?> </body> </html> </pre> </code>

تنها یک خط از آن که در زیر آمده است پی اچ پی می باشد و بقیه آن HTML می باشد.


<?php
echo 'Hello world!'; ?>



انواع تایپ ها


PHP همه متغیرها را در یک محدوده مستقل ذخیره می‌کند. این محدوده به طور نمونه ۳۲ بیت اعداد علامتدار است. اعداد بدون علامت در حالتهای معینی به مقادیر علامتدار تبدیل می‌شوند: این رفتار متفاوت از زبانهای برنامه نویسی است. متغیرهای صحیح می‌توانند به صورت دهدهی(مثبت یا منفی) ٬هشت هشتی و شانزده شانزدهی مشخص شوند.

اعداد واقعی نیز در محدوده معینی ذخیره می‌شوند. آنها می‌توانند به دو صورت اعشاری و علمی استفاده شوند.PHP دارای یک نوع محلی بولین می‌باشد که شبیه به بولین در زبان جاوا و ++C است. در نوع داده بولین مقدار غیر صفر به عنوان درست و مقدار صفر به عنوان نادرست استفاده می‌شود. همانطور که در پرل و ++C نیز همین طور است.

نوع داده null برای متغیرهایی که هیچ مقداری ندارند استفاده می‌شود.

متغیرهایی با نوع مرجع(resource) به منابع خارجی اشاره می‌کنند. اینها نوعا توسط توابع ایجاد می‌شوند و تنها می‌توانند با همان تابع مورد استفاده قرار گیرند. مانند پوشه‌ها و عکسها و پایگاه داده.

PHP آرایه‌ها و رشته‌ها را هم پشتیبانی می‌کند. آرایه می توانند متغیرهایی از هر یک از انواع داده که توسط زبان پشتیبانی می شود تشکیل شده باشد. رشته ها را هم می توان با " " نمایش داد هم با ' ' .


چند ویژگی php

1- در php متغیر ها با $ مشخص می شوند که در واقع از روش keywords برای مشخص کردن کلمات کلیدی  استفاده می کند و به این ترتیب کلمات کلیدی مثل if با نداشتن $ مشخص می شوند.


<?php
$txt="Hello World!";
$x=16;
?>


2- php در زمان type checking ،compile انجام نمی دهد و type checking  ضعیف دارد و اگر در خود تابع از اینکه تایپ های مختلف با هم در دو طرف عملیات باشند جلوگیری نشود error داده نمی شود.



 توابع

 اختیاری بودن تعداد آرگومان ها

در php می توان تابع را یا تعدادی آرگومان تعریف کرد ولی در هنگام صدا کردن آنها می توان با تعداد آرگومان های کمتر یا بیشتر آنها را صدا کرد.همان طور که در کد زیر مشاهده می شود.



  1. // function with 2 optional arguments  
  2. function foo($arg1 = ''$arg2 = '') {  
  3.     echo "arg1: $arg1\n";  
  4.     echo "arg2: $arg2\n";  
  5. }  
  6. foo('hello','world');  
  7. /* prints: 
  8. arg1: hello 
  9. arg2: world 
  10. */  
  11. foo();  
  12. /* prints: 
  13. arg1: 
  14. arg2: 
  15. */ 

از تابع () func_get_args برای مشخص شدن تعداد ورودی هایی که تابع با آنها صدا زده شده استفاده می شود.


  1. // yes, the argument list can be empty  
  2. function foo() {  
  3.     // returns an array of all passed arguments  
  4.     $args = func_get_args();  
  5.     foreach ($args as $k => $v) {  
  6.         echo "arg".($k+1).": $v\n";  
  7.     }  
  8. }  
  9. foo();  
  10. /* prints nothing */  
  11. foo('hello');  
  12. /* prints 
  13. arg1: hello 
  14. */  
  15. foo('hello''world''again');  
  16. /* prints 
  17. arg1: hello 
  18. arg2: world 
  19. arg3: again 
  20. */  



چند مثال از تابع های موجود


1-error and logging function

این توابع امکان رفع خطا و ذخیره سازی را می دهند.

توابع error به کاربر اجازه می دهند که قوانین رفع خطا را مشخص کنند و توابع ثبت کننده هم این اجازه را می دهند که کاربر بتواند از برنامه log داشته باشد و خطا ها را به ایمیل بفرستد و یا با مکانیزم های دیگر آنها را ذخیره کند.به برخی از این توابع در زیر اشاره شده است.


debug_backtrace ()


این تابع به صورت بازگشتی اطلاعاتی را از کد که باعث شده به این تابع برسیم را نمایش می دهد.این اطلاعات را به صورت آرایه نمایش می دهد.
اطلاعاتی که در هر یک از خانه های آرایه ذخیره می شوند عبارت اند از:
اسم تابع-اسم فایل ذخیره شده در آن-شماره خط و...
کد زیر یک نمونه استفاده از این تابع می باشد.

<?php
function one($str1, $str2)
{
two("Glenn", "Quagmire");
}
function two($str1, $str2)
{
three("Cleveland", "Brown");
}
function three($str1, $str2)
{
print_r(debug_backtrace());
}

one("Peter", "Griffin");
?>

که خروجی آن به صورت زیر است.


Array
(
[0] => Array
(
[file] => C:\webfolder\test.php
[line] => 7
[function] => three
[args] => Array
(
[0] => Cleveland
[1] => Brown
)
)
[1] => Array
(
[file] => C:\webfolder\test.php
[line] => 3
[function] => two
[args] => Array
(
[0] => Glenn
[1] => Quagmire
)
)
[2] => Array
(
[file] => C:\webfolder\test.php
[line] => 14
[function] => one
[args] => Array
(
[0] => Peter
[1] => Griffin
)
)
)

user_error()

برای تولید error مناسب در جای مشخص شده توسط برنامه نویس که در هنگام رخ داد error بتوان به راحتی مکان آن و علت آن را پیدا کرد.



<?php
$test=2;
if ($test>1)
{
user_error("A custom error has been triggered");
}
?

Notice: A custom error has been triggered
in C:\webfolder\test.php on line 6

برخی دیگر از این توابع عبارت اند از:

()restore error handler

() error get last

() set exception handler

() trigger error

()set_error_handler


2-date

از این تابع برای مشخص کردن فرمت نمایش تاریخ استفاده می شود .و همچنین این تابع می تواند یک آرگومان  دیگر داشته باشد که یک زمان مشخص را با یک فرمت خاص بدهد. مثلا تاریخ فردا را با یک فرمت خاص چاپ کند.کد زیر این کار را انجام می دهد.

<?php
$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "Tomorrow is ".date("Y/m/d", $tomorrow);
?>


Tomorrow is 2009/05/12


3-serialize() 

در php  از این تابع برای ذخیره  ساختار های  پیچیده  استفاده می شود.

کد زیر کاربرد این تابع را نشان می دهد.


  1. // a complex array  
  2. $myvar = array(  
  3.     'hello',  
  4.     42,  
  5.     array(1,'two'),  
  6.     'apple'  
  7. );  
  8. // convert to a string  
  9. $string = serialize($myvar);  
  10. echo $string;  
  11. /* prints 
  12. a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";} 
  13. */  
  14. // you can reproduce the original variable  
  15. $newvar = unserialize($string);  
  16. print_r($newvar);  
  17. /* prints 
  18. Array 
  19. ( 
  20.     [0] => hello 
  21.     [1] => 42 
  22.     [2] => Array 
  23.         ( 
  24.             [0] => 1 
  25.             [1] => two 
  26.         ) 
  27.     [3] => apple 
  28. ) 
  29. */  

۱ نظر موافقین ۰ مخالفین ۰ ۰۴ آذر ۹۱ ، ۱۷:۰۳
فهیمه هاجری

مقدمه

روبی در لغت به معنای یاقوت است. هم چنین روبی نام زبانی اسکریپتی نیز هست که زبانی داینامیک، دارای reflection، عام منظوره و دارای شی‌گرایی است که از تلفیق syntax زبان‌های perl و smalltalk به دست آمده‌است. هم چنین این زبان از Eifell و Lisp نیز تاثیر پذیرفته است. این زبان از پارادایم‌های مختلفی شامل تابعی، شی‌گرا، دستوری و رفلکتیو پشتیبانی می‌کند.

نسخه‌ی ۱.۸.۷ مفسر این زبان با زبان C پیاده‌سازی شده‌است. این زبان دارای dynamic type و مدیریت حافظه‌ی خودکار است. هم‌چنین مفسر این زبان single pass است.


تاریخچه

روبی در سال ۲۴ فوریه‌ی سال ۱۹۹۳ توسط یوکیهیرو ماتسوموتو طراحی شد. هدف وی از طراحی این زبان جدید، برقراری تعادل میان برنامه‌نویسی دستوری و امری بود. ماتسوموتو می‌گوید:«من زبانی اسکریپتی را می‌خواستم که از Perl قدرتمندتر باشد و از پایتون شی‌گراتر. این دلیل تصمیم من است مبنی بر طراحی زبان شخصی‌ام».

اولین release عمومی روبی در ۲۱ دسامبر ۱۹۹۵ در گروه‌های خبری در ژاپن اعلام شد. این release هم‌زمان شد با راه‌اندازی یک  mailing list برای روبی به زبان ژاپنی. در این مرحله روبی از بسیاری از امکاناتی که بسیاری از زبان‌ها از آن برخوردارند، برخوردار بود. تعدادی از این امکانات عبارت‌اند از: شی‌گرایی، کلاس‌های با وراثت، exception handling و جمع‌آوری زباله و ... .

روبی ۱.۰ در سال ۱۹۹۶ منتشر شد و در سال ۱۹۹۹ برای اولین بار یک mailing list به زبان انگلیسی به راه افتاد. از طرف دیگری کتابی به نام «Programming Ruby» به صورت رایگان در اختیار برنامه‌نویسان قرار گرفت که باعث سرعت گرفتن محبوبیت این زبان در میان انگلیسی زبانان شد.

روبی در نسخه‌های ۱.۲، ۱.۴، ۱.۶ و ۱.۸ به ترتیب در سال‌های ۱۹۹۸، ۱۹۹۹، ۲۰۰۰ و ۲۰۰۳ منتشر شدند.

در نزدیکی سال ۲۰۰۵، RubyOnRails، یک framework برای تولید محصولات تحت وب نوشته‌شد که باعث محبوبیت بیشتر روبی گردید.

در دسامبر سال ۲۰۰۷، روبی نسخه‌ی ۱.۹ توزیع شد که تفاوت‌های عمده‌ای با نسخه‌های قبلی داشت. نمونه‌هایی از این تغییرات عبارت‌اند از:

  • معرفی متغیر‌های محلی، یعنی متغیرهایی که در بلاک تعریفشان موجودند،
  • تعریف syntax جدید برای lambda
  • پشتیبانی character encodingها
  • واسط جدید socket
  • ...
اکنون روبی ۲.۰ در حال طراحی است که گفته می‌شود ۱۰۰٪ با روبی ۱.۹.۳ (آخرین نسخه‌ی توزیع شده) سازگاری دارد. قرار است این نسخه در فوریه‌ی سال ۲۰۱۳ توزیع شود.

آموزش زبان روبی
روبی به دو صورت قابل اجرا است. یکی به صورت تعاملی(کنشی، interactive) و دیگری به صورت دسته‌ای (batch). در این‌جا ما کار با حالت تعاملی را آموزش می‌دهیم. حالت دیگر هیچ تفاوتی ندارد به جز این‌که باید همه‌ی این دستورات درون یک یا چند فایل جداگانه نوشته شوند و سپس به مفسر داده شوند.
برای قرار گرفتن در حالت تعاملی، کافی است بعد از نصب روبی، از دستور irb در سامانه‌های یونیکس-مبنا استفاده کنیم. در این صورت، باید در ترمینال چیزی شبیه به این دیده شود:
irb(main):001:0>

در صورت مشاهده‌ی این رشته در ترمینال می‌توانید از صحت نصب روبی خود مطمئن شوید. حال اگر در این‌جا بنویسید "Hello World" و سپس دکمه‌ی Enter را فشار دهید، خواهید دید:

irb(main):001:0> "Hello World"
=> "Hello World"
دقت کنید که چیزی که در این‌جا نوشته‌شد، صرفا «خروجی» عبارت ورودی‌اش را چاپ می‌کند. برای مثال:
irb(main):001:0> 2+3
=> 5
اگر بخواهیم عبارتی را در خروجی چاپ کنیم می‌توانیم از دستور puts استفاده کنیم:
irb(main):001:0> puts "Hello World"
Hello World
=> nil
دقت کنید که این دستور، رشته‌ی ورودی‌اش را چاپ می‌کند، اما به عنوان یک تابع خروجی ندارد یا به عبارت دیگر خروجی آن nil است.
برای تعریف یک تابع کافی است از def و end استفاده کنیم. به مثال زیر توجه کنید:
irb(main):001:0> def h
irb(main):002:1> puts "Hello World!"
irb(main):003:1> end
=> nil

شاید بهتر باشد به این مثال کمی با دقت توجه کنیم. تعریف این تابع با عبارت def h آغاز شده است که بداهتا def کلید واژه‌ی معرف شروع تعریف تابع و h نام تابع است. در این‌جا نه پرانتزی قرار گرفته‌است و نه ورودی‌ای. پس این تابع ورودی ندارد. نکته‌ای که لازم به ذکر است این است که پرانتزگذاری در این زبان هم کاملا اختیاری است. تا ان‌جایی که ابهامی رخ ندهد، می‌توان از پرانتزگذاری اجتناب کرد. حال اگر نیاز به ورودی بود صرفا نام متغیر‌ها را بعد از h قرار می‌دهیم.

در این مثال به نکته‌ی دیگری نیز توجه کنید: در promptی که روبی بعد از ورود هر دستور می‌دهید، دو عدد وجود دارد: مانند 002:1. در این‌جا 002 شمارنده‌ی تعداد دستورات وارد شده‌است و 1 نشان‌دهنده‌ی عمق کد ماست و یا این که در چه سطحی از بلاکینگ در حال برنامه‌نویسی هستیم.

حال به مثال زیر توجه کنید: 

irb(main):001:0> def h name="fahime" # "fahime" is name's default value
irb(main):002:1> puts "Hello #{name.capitalize}!"
irb(main):003:1> end
=> nil
irb(main):004:0> h "nima"
Hello Nima!
=> nil

دقت کنید که عبارت {name.capitalize}# در داخل علامت نقل قول قرار گرفته است. با این وجود تابع capitalize را روی name صدا می‌زند. این ویژگی دقیقا به همین صورت در Perl نیز وجود دارد.

کمی شی‌گرایی: تعریف کلاس در این زبان کاملا شبیه پایتون است. به مثال زیر توجه کنید:

irb(main):001:0> class Greeter
irb(main):002:1>    def initialize(name = "World")
irb(main):003:2>       @name = name
irb(main):004:2>    end
irb(main):005:1>    def say_hi
irb(main):006:2>       puts "Hi #{@name}!"
irb(main):007:2>    end
irb(main):008:1>    def say_bye
irb(main):009:2>       puts "Bye #{@name}, come back soon."
irb(main):010:2>    end
irb(main):011:1> end
=> nil
irb(main):012:0> g = Greeter.new ("Nima")
=> #<Greeter:0x16cac @name="Nima">
irb(main):013:0>g.say_hi
Hi Nima!
=> nil

تا این‌جا نکاتی که تقریبا از syntax روشن است را ذکر می‌کنیم. دقت کنید که در این‌جا هیچ حرفی از تایپ متغیرهایمان نزده‌ایم. در حقیقت هیچ‌گاه نیز این کار را انجام نخواهیم داد. این زبان نیز از type checking پویا تبعیت می‌کند.  البته type checking آن strong است، زیرا هیچ تایپی را به طور ضمنی به تایپ دیگری تبدیل نمی‌کند. از طرف دیگر، تعریف صریح صفات کلاس در خود کلاس نیامده است. بلکه در سازنده (همان initialize) گفته‌ایم name@ را برابر name قرار بده. بنابراین اشیا در این زبان پویا (dynamic) هستند. این ویژگی، در پایتون نیز وجود داشت. نکته‌ی جالب دیگری که در این زبان وجود دارد این است که برای مشخص کردن صفات (attributeها) از یک نماد @ در ابتدای نام صفت استفاده می‌کنیم. این @ از حرف اول Attribute گرفته شده است. (در مورد میزان پویایی این زبان بیش از این سخن خواهیم گفت). با وجود انعطاف‌پذیری و شاید تا حدی شلختگی این زبان، هم چنان امکان دسترسی مستقیم به صفات وجود ندارد:

irb(main):014:0>g.@name
SyntaxError: compile error
(irb):52: syntax error
        from (irb):52
فعلا برای مدتی این موضوع را فراموش کنید.
حال اگر بخواهیم لیست توابع موجود در یک کلاس را ببینیم کافی است تابع instance_methods را روی نام کلاس صدا کنیم:
irb(main):015:0> Greeter.instance_methods
=> ["method", "send", "object_id", "singleton_methods",
    "__send__", "equal?", "taint", "frozen?",
    "instance_variable_get", "kind_of?", "to_a",
    "instance_eval", "type", "protected_methods", "extend",
    "eql?", "display", "instance_variable_set", "hash",
    "is_a?", "to_s", "class", "tainted?", "private_methods",
    "untaint", "say_hi", "id", "inspect", "==", "===",
    "clone", "public_methods", "respond_to?", "freeze",
    "say_bye", "__id__", "=~", "methods", "nil?", "dup",
    "instance_variables", "instance_of?"]
اما خوب، این توابع را کی و کجا پیاده‌سازی کرده‌ایم؟ در حقیقت این لیست شامل توابع به ارث رسیده نیز می‌شود، برای این که این توابع نمایش داده نشوند چنین عمل می‌کنیم:
irb(main):016:0> Greeter.instance_methods(false)
=> ["say_bye", "say_hi"]
برای این‌که ببینیم آیا می‌توان یک تابع را روی یک مصداق (instance) خاص از یک کلاس صدا زد یا نه می‌توان ایندر حقیقت در هر زمان می‌توان چنین عمل کرد:
irb(main):017:0> g.respond_to?("name")
=> false
irb(main):018:0> g.respond_to?("say_hi")
=> true
irb(main):019:0> g.respond_to?("to_s")
=> true
حال فرض کنید ما در این لحظه نیاز داریم که این قابلیت را به این کلاس بیفزاییم که امکان برگرداندن و یا حتی تغییر name را فراهم کند. چه باید کرد؟ می‌توان این کلاس را در همین جا مجددا «باز کرد» و تغییراتی را در آن اعمال کرد! پویایی از این بیشتر؟
irb(main):020:0> class Greeter
irb(main):021:1>   attr_accessor :name
irb(main):022:1> end
=> nil

توجه کنید که این تغییر اعمال شده، نه تنها در اشیای جدید، بلکه در اشیایی که از پیش ساخته شده‌اند نیز اعمال خواهد شد(تکبیر)! در این‌جا attr_accessor :name دو متد را به این کلاس می‌افزاید: یکی name‌برای گرفتن مقدار name@ و دیگری =name برای تغییر آن.

حال نوبت آن است که این زبان را به صورت غیر تعاملی نیز تجربه کنیم. با نوشتن quit یا exit می‌توان از این محیط خارج شد. حال، در فایلی مانند nima.rb کد زیر را قرار دهید:

#!/usr/bin/env ruby

class MegaGreeter
  attr_accessor :names

  # Create the object
  def initialize(names = "World")
    @names = names
  end

  # Say hi to everybody
  def say_hi
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("each")

      # @names is a list of some kind, iterate!
      @names.each do |name|
        puts "Hello #{name}!"
      end
    else
      puts "Hello #{@names}!"
    end
  end

  # Say bye to everybody
  def say_bye
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("join")
      # Join the list elements with commas
      puts "Goodbye #{@names.join(", ")}.  Come back soon!"
    else
      puts "Goodbye #{@names}.  Come back soon!"
    end
  end

end


if __FILE__ == $0
  mg = MegaGreeter.new
  mg.say_hi
  mg.say_bye

  # Change name to be "Zeke"
  mg.names = "Zeke"
  mg.say_hi
  mg.say_bye

  # Change the name to an array of names
  mg.names = ["Albert", "Brenda", "Charles",
    "Dave", "Englebert"]
  mg.say_hi
  mg.say_bye

  # Change to nil
  mg.names = nil
  mg.say_hi
  mg.say_bye
end

حال کافی است اجازه‌ی اجرا شدن را به این فایل بدهید و در shell دستور nima.rb/. را اجرا کنید. دقت کنید که خط اول به shell می‌فهماند که باید روبی را صدا کند و آدرس این فایل را به عنوان تنها ورودی به وی بدهد. سپس روبی این فایل را باز و سپس اجرا می‌کند. دقت کنید که در روبی # علامتی است که مخصوص comment است. پس مشکلی در اجرای کد ایجاد نمی‌کند.

نظر نویسنده: شاید دلیل این که در این زبان‌ها از # برای مشخص کردن comment استفاده می‌شود همین موضوع باشد. پایان نظر نویسنده!

یک نکته‌ی کوچک: نحوه‌ی ایجاد مصداق: g = Greeter.new

حال باید به یک نکته در این کد بپردازیم:

      @names.each do |name|
        puts "Hello #{name}!"
      end
در این سه خط که در تابع say_hi قرار گرفته است، ابتدا از name@ پرسیده‌ایم که آیا به each پاسخ می‌دهد یا خیر. بعد با فرض مثبت بودن جواب، این سه خط اجرا می‌شود. در این‌جا آن قسمتی که بین do و end قرار دارد یک تابع lambda است که ورودی آن، name، از تابع each گرفته می‌شود. این زبان از توابع lambda نیز پشتیبانی می‌کند.
در مجموع، هر چند که این امکانات در این زبان، باعث راحت شدن کار برنامه‌نویس می‌شود(که این تا حدی مطابق (Responsible Design Principle است)، اما از سادگی کاسته و برنامه نویس برای فهمیدن رفتار برنامه باید تلاش بسیار کند که این خلاف Simplicity Principle است. هم‌چنین این موضوع خلاف Impossible Error Principle نیز هست. زیرا مفسر هیچگونه تلاش موثری در راستای تشخیص خطای احتمالی توسط برنامه‌نویس نمی‌کند. از طرف دیگر، برای این که بفهمیم در یک کلاس چه متدی وجود دارد و چه متدی وجود ندارد، باید به زمان اجرا نگاه کنیم که خلاف Structure Principle است.
در هر صورت، خروجی برنامه به این قرار است:
Hello World!
Goodbye World.  Come back soon!
Hello Zeke!
Goodbye Zeke.  Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Englebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert.  Come
back soon!
...
...

نکته‌ی دیگری که در این کد وجود دارد عبارت if __FILE__= $0 است. توجه به این نکته لازم است که شاید کسی بخواهد بعدا از این کد به عنوان کتابخانه استفاده کند. طبیعتا نباید هیچ کدی در این حالت اجرا شود. این شرط صرفا این را چک می‌کند که آیا این فایل، فایلی بوده که درخواست اجرای آن آمده یا خیر.

وراثت

روبی از وراثت چندگانه پشتیبانی نمی‌کند، اما از وراثت یگانه پشتیبانی می‌کند:

class A < B
   ....
مکانیزم رفع استثنا(Exception Handling)
این زبان نیز مانند بسیاری از زبان‌های دیگر امکان جدا کردن قسمت اصلی برنامه و جریان‌های شق‌های دیگر (alternative flows) را در اختیار برنامه‌نویس قرار می‌دهد. این موضوع به خوانا شدن کد کمک می‌کند:
f = File.open("testfile")
begin
  # .. process
rescue
  # .. handle error
else
  puts "Congratulations-- no errors!"
ensure
  f.close unless f.nil?
end
هر چند این زبان امکانات بسیار دیگری نیز دارد که به آن‌ها اشاره نشد، اما عمده‌ی نکات مهم این زبان با مثال مطرح گردید و مابقی چیزی بیش از syntax صرف نیست.

منابع


۰ نظر موافقین ۰ مخالفین ۰ ۰۴ آذر ۹۱ ، ۱۶:۳۳
نیما حمیدی

مقدمه

Perl یک زبان برنامه‏نویسی سطع بالای عام منظوره است که توسط مفسر اجرا می شود. Perl یک زبان پویا است. زبان برنامه‏نویسی پویا به زبانی گفته می‏شود که بسیاری از کارهایی را که زبان‏های برنامه‏نویسی دیگر در زبان کامپایل انجام می‏دهند، در زمان اجرا انجام می‏دهد. این اعمال، می‏تواند شامل این موارد باشد: افزودن کد جدید(مانند تابع eval که در جاوا اسکریپت بیان کردیم)، توسعه‏ی اشیا (مانند افزودن یا حذف فیلد و یا متد از یک شی موجود و یا تغییر کلاس آن) و یا تغییر سیستم تایپ (مانند استفاده از reflection).


تاریخچه

Perl در ابتدا در سال 1987 توسط لری وال ایجاد شد. هدف از ایجاد این زبان اسکریپتی، تسهیل فرآیند گزارش‏گیری در یونیکس بود. پس از آن، این زبان دچار تغییرات عمده‏ای شد و آخرین نسخه‏ی این زبان، که در سال 2012 منتشر شد، نسخه‏ی 5.16 است. هم‏چنین در سال 2000 اعلام شد که این زبان در حال طراحی مجدد است، اما هم‏چنان در حال توسعه‏ی فعال است.

این زبان ویژگی‏هایی را مرهون زبان‏هایی مانند C، شل اسکریپت، AWK و sed است. این زبان، ابزارهای قدرتمندی را برای پردازش متن در اختیار کاربران قرار می‏دهد که بسیاری از محدودیت‏های ابزارهای مدرن در یونیکس را نداشت. Perl امکان دستکاری فایل‏های متنی را در اختیار کاربران قرار می‏دهد. این زبان در اواخر دهه‏ی 90، به دلیل وجود امکانات پارس کردن، محبوبیت گسترده‏ای را در اسکریپتینگ برای CGI(Common Gateway Interface) به دست آورد.

در مستندات این زبان آمده است که این زبان با هدف عملی بودن(سادگی در استفاده، کارایی، و کامل بودن) ایجاد شده است و نه زیبایی(تمیز بودن، کمینگی...).


آموزش زبان

در ادامه به بررسی زبان به همراه کدهای نمونه می‌پردازیم. هم‌چنین به نکات مهم این زبان نیز به طور پیوسته، هر جا که لازم بود، اشاره می‌کنیم.


برای اجرای یک برنامه‌ی Perl، کافی است کد آن را در فایلی، مثلا با نام prog.pl، ذخیره کرده و سپس از دستور زیر استفاده کنیم:

perl prog.pl

و یا می‌توان در خط اول فایل مورد نظر قرار داد:

#!/usr/bin/perl

و سپس با تغییر مد فایل به ۷۵۵ با دستور زیر این اسکریپت را اجرا کرد:

./prog.pl

Perl در پردازش فایل ورود‌ی‌اش، تا حد امکان از خطاها صرف نظر می‌کند. برای این که از این مفسر بخواهیم که این کار را انجام ندهد، می‌توانیم این دو خط را به اول فایلمان بیافزاییم:

#!/usr/bin/perl
use strict;
use warnings;

در Perl نیازی به داشتن تابعی مانند main نیست.  هم‌چنین در این زبان، فضاهای سفید در نظر گرفته نمی‌شوند به جز در بین دو علامت نقل قول:

print "Hello,
   World."; # <- this is a comment

نتیجه به این صورت خواهد بود:

Hellow,
   World.

تعریف متغیر و استفاده از آن در چاپ در خروجی در این زبان به این صورت انجام می‌پذیرد:

my $animal = "camel";
print "my animal is $animal";

توجه کنید که در این جا ما تایپ متغیر را تعریف نکردیم و این موضوع به صورت ضمنی(implicit) مشخص می‌شود. بنابراین نوع بررسی تایپ این زبان از نوع ضعیف است. حتی این زبان در صورت لزوم تبدیلات لازم را انجام می‌دهد. 

نکته‌ی دیگری که در اینجا وجود دارد این است که همان طور که در بالا مشخص است، identifier های این زبان با $ آغاز می‌شوند. البته این همیشه درست نیست. در حقیقت همیشه با یک sigil آغاز می‌شوند. بنابراین روشی که این زبان در حل مشکل کلمات کلیدی انتخاب کرده‌است این است که identifierها را از کلمات کلیدی با یک کاراکتر در ابتدایشان مشخص می‌کند. این راه حل بسیار شبیه پیاده‌سازی php است.

برای تعریف آرایه و استفاده از آن نیز باید به این صورت استفاده کرد:

my @animals = ("camel", "llama", "owl");
print $animals[0];

توجه کنید که برای تعریف آرایه از علامت @ و برای مشخص کردن یک عضو خاص آن از $ استفاده می‌کنیم.

هم چنین این زبان، انجام برخی کارهای مهم مانند مرتب سازی را به این سادگی در اختیار ما قرار می‌دهد:

my @sorted = sort @animals;
my @reversed = reverse @animals;
my @subarray = @animals [1..@#animals]; # note that @#animals gives the last index

داده ساختار دیگری که در این زبان وجود دارد hash نام دارد که همان map در جاوا است! برای تعریف آن می‌توان به صورت زیر عمل کرد:

my %fruit_color = (
    apple => "red",
    banana => "yellow",
);
print "the color of apple is $fruit_color{'apple'}\n";
my @fruits = keys %fruit_color;
my @colors = values %fruit_color;

در این زبان، scope هر متغیر تا انتهای بلاکی است که در آن تعریف شده‌است و هم‌چنین این زبان static scope است.


ساختارهای شرطی و حلقه

در این زبان ساختار شرطی به صورت‌های زیر موجود است:

if (condition) {
   ...
} elsif (other condition) {
   ...
} else {
}
unless (condition) { # this is a short hand of if(!condition)
   ...
}

دستورهای حلقه‌ای نیز به این صورت وجود دارند:

while (condition) {
   ...
}
unless (condition) { # the same as unless
   ...
}

syntax حلقه‌ی for آن کاملا مانند زبان C است:

for ($i = 0;$i < 10;$i ++) {
   ...
}

هم‌چنین امکان استفاده از foreach نیز در این زبان وجود دارد:

foreach my $key (keys %hash) {
   ...
}


عملگر های Perl

در این زبان تمامی عملگرها دقیقا مشابه زبان C هستند، با یک تفاوت کوچک: برای مقایسه‌ی رشته‌ها از عملگرهایی مانند eq، ne، lt و ... باید استفاده کرد. دلیل این تفاوت نکته‌ی جالبی است که به weak typing بودن زبان بر می‌گردد. در تعریف یک متغیر این زبان، نه تنها در هنگام تعریف تایپی نسبت داده نمی‌شود، بلکه در هنگام اجرا نیز اگر لازم باشد "72" را به عدد ۷۲ نیز تبدیل می‌کند. از طرف دیگر، عدد ۱۰۰ به عنوان یک عدد باید از ۹۹ بیشتر باشد، در حالتی که به عنوان یک رشته باید کوچک‌تر باشد. بنابراین ما نیاز داریم از عملگرهای متفاوتی برای مشخص کردن این تفاوت استفاده کنیم.


استفاده از فایل ورودی و خروجی نیز در این زبان بسیار ساده است:

open (my $in, "<", "input.txt") or die ("Can't open input.txt"); # kind of exception handling!
open (my $out, ">", "output.txt");
open (my $log, ">>", "my.log");

my $line = <$in>; # for reading one line
my $lines = <$in>; # for reading whole file

توجه کنید که همان‌طور که قبلا گفته بودیم، این زبان امکان کار با فایل و رشته‌ها را به شیوه‌ای بسیار ساده در اختیار ما قرار می‌دهد. کد بالا را با کد معادلش در زبان‌های دیگر مانند جاوا مقایسه کنید. طبیعتا، در چنین زبانی باید استفاده از عبارات منظم نیز به سادگی و  گستردگی میسر باشد. حال به بیان عبارات منظم در این زبان می‌پردازیم:


عبارات منظم

بررسی وجود یک زیررشته‌ی خاص در یک رشته‌ی موجود به این صورت انجام می‌شود:

if ($a =~ /foo/) { ... }

برای جانشین کردن یک رشته با رشته‌ای دیگر نیز از کدهای زیر می‌توان استفاده کرد:

$a =~ s/foo/bar/; # substituting first foo with bar
$a =~ s/foo/bar/g; # substituting ALL foo's with bar

به عنوان آخرین نکته، می‌توان از تکه کد زیر برای استخراج نام کاربری و نام میزبان یک رایانشانی استفاده کرد. عبارات داخل پرانتز، هر کدام، با 1$ و 2$ مشخص می‌شوند.

if ($email =~ /([^@]+)@(.+)/) {
   print "Username is $1";
   print "Hostname is $2";
}


تعریف زیر رویه‌ها

نوشتن زیر رویه به سادگی کد زیر است:

sub logger {
   my $logmessage = shift;
   open my $logfile, ">>", "my.log" or die "could not open log file";
   print $logfile $logmessage;
}

و صدا زدن این رویه به صورت زیر است:

logger ("We have a logger subroutine");

اما این کد چگونه کار می‌کند؟ اولا روشن است که با عبارت sub logger مشخص کرده‌ایم که می‌خواهیم زیر رویه‌ای با نام logger داشته باشیم. اما shift چیست؟ در Perl، ورودی‌های یک تابع در متغیری به نام _@ قرار دارند. از طرفی در داخل تعریف توابع، توابعی که با آرایه‌های کار می‌کنند مانند push، pop، shift و unshift به صورت پیش‌فرض این آرگومان را دریافت می‌کنند. کار تابع shift همان‌طور که از نامش پیداست، حذف اولین عنصر یک لیست و برگرداندن آن است. بقیه‌ی کار این رویه نیز واضح است.

این نوع پاس دادن آرگومان، خلاف اصول Impossible Error Principle و Defence in Depth Principle است.


شی‌گرایی در Perl

در Perl شی‌گرایی به صورت کمینه وجود دارد. البته Perl از مفاهیمی چون inheritance، encapsulation و polymorphism که پایه‌های شی‌گرایی هستند پشتیبانی می‌کند. حتی از وراثت چندگانه نیز پشتیبانی می‌کند. در این زبان syntax خاصی برای ساخت یک شی وجود ندارد. بلکه اشیا، معمولا داده‌ساختارهای خود Perl هستند که به صورت صریح به کلاس‌ها نسبت داده می‌شوند. این انتساب با کمک تابع بطنی bless صورت می‌گیرد که معمولا در سازنده‌ی شی استفاده می‌شود.

در این جا، مثالی از تعریف یک کلاس را به همراه سازنده‌اش می‌توانید مشاهده کنید:

package A;

sub new {
   my $class = shift;

   return bless {}, $class;
}

my $anInstance = A->new;

در این‌جا نکات جالبی دیده می‌شود. اولا برای تعریف کلاس، از دستور package استفاده می‌شود! در این‌جا ما در حال تعریف کلاس A هستیم. حال، برای این کلاس، متدی با نام new نوشتیم که نقش سازنده‌ی این کلاس را بازی خواهد کرد. توجه کنید که new کلید واژه نیست و هر نام دیگری را می‌توان برای این متد می‌توان قرار داد. هرچند که در CPAN(Comprehensive Perl Archive Network) مرسوم است که از new استفاده می‌کنند. حال، این سازنده با کمک دستور shift که پیشتر بیان شد، ابتدا نام کلاسش را می‌گیرد. سپس با کمک دستور bless مجموعه‌ی فیلدهای این کلاس را که در این‌جا hash خالی {} است را به کلاس class$ مربوط می‌کند. خروجی این تابع شی ساخته شده است که با کمک A->new ساخته می‌شود.

حال، برای این که این کلاس، کلاس دیگری را توسعه دهد، کافی است از دستور زیر بلافاصله بعد از package استفاده شود:

use parent 'A', 'B', ...;

در این زبان، متد ها را می‌توان به همان شیوه‌ی سازنده تعریف نمود و استفاده از فیلدها نیز به این صورت انجام می‌پذیرد:

package Student;

sub new {
   my $class = shift;
   my $name = shift;
   my $id = shift;

   my $self = {
         name => $name,
         id => $id,
      };
   bless $self, $class;
};

sub print_info {
   my $self = shift;

   print "Student name = $self->{name} ",
         "and Student id = $self->{id}\n";
};

my $student = Student->new ("Nima Hamidi", 87109956);
$student->print_info ();


منابع

ویکی پدیای Perl

وبگاه رسمی Perl

وبگاه آموزش Perl

۱ نظر موافقین ۰ مخالفین ۰ ۰۳ آذر ۹۱ ، ۱۹:۵۸
نیما حمیدی

جاوا اسکریپت که آن را به اختصار js نیز می‏نامند، زبانی اسکریپتی است که در بیشتر مرورگرهای وب به عنوان بخشی از مرورگر پیاده‏سازی شده است و هدف از آن بهبود بخشید واسط کابری و تولید صفحات پویای وب است. البته استفاده از جاوا اسکریپت تنها به وب محدود نمی‏شود. در زیر انواعی از این استفاده‏ها ذکر شده‏است:

  • در گوگل کروم برای تولید pluginها از این زبان استفاده می‏شود.
  • در نرم‏افزار geogebra برای رسم شکل‏های هندسی و یا تحلیل آن‏ها استفاده می‏شود.
  • در نرم‏افزار adobe acrobat اجازه‏ی استفاده از جاوا اسکریپت در فایل‏های pdf داده شده است.
تاریخچه
جاوا اسکریپت ابتدا در شرکت Netscape توسط Brendan Eich تولید شد. هدف از انجام این پروژه مقابله با مایکروسافت در حوزه‏ی اینترنت بود. شرکت Netscape می خواست نسخه‏ی قابل حمل جاوا را روی مشتری اجرا کند، نسخه‏ای که توسط یک مفسر اجرا شود. بنابراین ابتدا زبانی را ایجاد کردند که نام آن در هنگام ایجاد Mocha و در اولین توزیع، LiveScript بود که بعد از آن به JavaScript تغییر نام داد.

پس از آن، این زبان به سرعت فراگیر شد و مایکروسافت از آن برای اولین بار در مرورگرش، اینترنت اکسپلورر، در نسخه‏ی 3.0 در سال 1996 استفاده کرد.

هم چنین در همان سال، یعنی سال 1996، Netscape این زبان را برای استاندارد کردن به Ecma International فرستاد و ادامه‏ی این فرآیند منجر به نسخه‏ی استاندارد ECMAScript شد.

ویژگی‏ها

ساخت یافتگی و دستوری
جاوا اسکریپت بیشتر نحو ساختاری زبان C را پشتیبانی می کند، مانند: if، for، switchو ... . یک تفاوت این زبان با C این است که در این زبان استفاده از semi-colon اختیاری است.

typing پویا
در جاوا اسکریپت، مانند اکثر زبان‏های پویا، "نوع" به مقدار نسبت داده می‏شود و نه به متغیر. بنابراین نوع type checking این زبان به صورت ضعیف است(weak typing). برای مثال، متغیری مانند x می تواند در ابتدا مقدارش یک عدد صحیح باشد و سپس مقدار آن را به یک رشته تغییر دهیم و الی آخر. از ویژگی‏های جالب این زبان این است که قابلیت duck typing دارد. duck typing یعنی:

"اگر پرنده‏ای مثل اردک راه برود، مثل اردک شنا کند و صدایش مانند اردک باشد، من به آن می گویم اردک!"

منظور از این اصل در این جا این است که در صورتی که یک شی، متدی مانند شی دیگر داشته باشد، و کسی بخواهد از شی دوم استفاده کند، می تواند از شی اول نیز استفاده کند. برای مثال، این مفهوم در جاوا وجود ندارد. زیرا اگر شما در کلاستان، متدهایی به نام‏های next، hasNext و remove را پیاده‏سازی کنید، هم چنان نمی توانید نمونه‏های این کلاس را به متدی که ورودی‏اش iterator است پاس دهید، هر چند که تمام واسط آن را پیاده‏سازی می‏کند. اما در جاوا اسکریپت این چنین نیست. هر شی‏ی که متد مورد نیاز یا متد دیگر را فراهم کند، می تواند به عنوان ورودی آن قرار گیرد.

ارزیابی زمان-اجرا
از جمله ویژگی‏های جاوا اسکریپت وجود تابعی به نام جاوا eval است که می تواند رشته‏ای را که شامل کدی به همین زبان است را گرفته و مقدار آن را محاسبه کند.

"نوع‏ها" در جاوا اسکریپت
جاوا اسکریپت از انواع مقابل پشتیبانی می‏کند: عدد صحیح، رشته، بولین، آرایه و شی:
var x = 0 // note that semi colon is not important
var x = 0.5; // note dynamic typing var x = "JavaScript" var x = true var x = ["java", "script"] var x = {java: "java", script: "script"} // object

شی گرایی در جاوا اسکریپت

در جاوا اسکریپت، علی رغم بحث‏هایی که در مورد تفاوت‏های شی‏گرایی در جاوا اسکریپت و دیگر زبان‏ها وجود دارد، قابلیت‏های شی‏گرایی بسیار وسیعی موجود است.

برنامه‏نویسی prototype-based

برنامه‏نویسی prototype-based سبکی از برنامه‏نویسی شی‏گراست که در آن کلاس‏ها حضور ندارند و استفاده‏ی مجدد رفتارها طی فرآیندی انجام می‏پذیرد که اشیای موجود را به عنوان ماده‏ی اولیه بیاراییم.

اشیای مرکزی

جاوا اسکریپت اشیایی مرکزی دارد. نمونه‏هایی از این اشیا عبارت‏اند از: Math, Object, Array و String. 

کلاس‏ها

در جاوا اسکریپت کلاس به صورتی که در دیگر زبان‏های برنامه‏نویسی مانند جاوا وجود دارد، وجود ندارد. در عوض، جاوا اسکریپت از توابع به جای کلاس‏ها استفاده می کند:

function Person () {}

اشیا

برای ساخت یک شی از یک کلاس کافی است از new برای یک تابع استفاده کنیم؛ به مثال زیر توجه کنید:

var person1 = new Person ();
var person2 = new Person ();

سازنده

در جاوا اسکریپت، نیاز به نوشتن سازنده نیست، زیرا خود تابع در زمان ساخته شدن صدا زده می‏شود:

function Person () {
    alert ('Person instantiated');
}

صفت

خیلی شبیه C!

function Person (gender) {
    this.gender = gender;
    alert ('Person instantiated');
}

var person1 = new Person ("Male");

متدها

برای تعریف یک متد، کافی است به صورت زیر عمل کنیم:

function Person (gender) {
    this.gender = gender;
    alert ('Person instantiated');
}

Person.prototype.sayHello = function () {
    alert ('Hello');
}

var person1 = new Person ('Male');
person1.sayHello ();
وراثت
کافی است که کلاس مورد نظر را به prototype کلاس فرزند نسبت به دهیم. سپس سازنده را اصلاح کنیم:
function Student () {
    // Call the parent constructor
    Person.call(this);
}

// Inherit Person
Student.prototype = new Person ();

// Correct the constructor pointer because it points to Person
Student.prototype.constructor = Student;

// Add sayGoodbye
Student.prototype.sayGoodbye = function () {
    alert ('goodbye');
}

var student1 = new Student ();
student1.sayHello (); // Inherited from Person
student1.sayGoodbye ();

منابع

ویکی پدیای جاوا اسکریپت

W3Schools

آموزش جاوا اسکریپت توسط موزیلا

۰ نظر موافقین ۰ مخالفین ۰ ۰۲ آذر ۹۱ ، ۱۳:۰۱
نیما حمیدی