سلام به همه! ما Functional February و Mechanical March را پشت سر گذاشتیم. حالا نوبت Analytical April است، که در آن روی زبانهایی تمرکز میکنیم که برای علم داده عالیاند.
همانطور که از ماههای گذشته انتظار دارید، در این ویدیو من و Erik یک مرور سریع از موضوع این ماه و زبانهای مختلفی که بررسی خواهیم کرد به شما میدهیم.
خب، طبق معمول، Erik کمی بعد زبانها را برایمان مرور میکند، ولی من اول چند نکتهی عملی این ماه را میگویم.
اول، زبانهای ویژهی این ماه. این ماه فقط سه زبان داریم: Julia، Python و R. هر کدام از این زبانها کاملاً متفاوتاند، و واضح است که Python زبانی بسیار چندکاره است، اما این ماه شما را تشویق میکنیم که این زبانها را با ذهنیت علم داده به کار ببرید.
برای گرفتن نشان Analytical April باید پنج تمرین را در یکی از این زبانها کامل کنید. کمی بعد تفاوتهایشان را بررسی میکنیم، اما از دید Exercism، مسیر Python ما سیلابس فوقالعادهای دارد، پس واقعاً توصیه میکنم آن را امتحان کنید. امیدواریم در طول همین ماه سیلابس Julia هم منتشر شود. بخش زیادی از کارش انجام شده و فقط نیاز به صیقل خوردن دارد. R سیلابس ندارد، ولی تمرینهای جالب زیادی دارد که میتوانید با آنها بازی کنید.
پنج تمرین ویژه برای امتحان کردن داریم:
- etl: که در آن میتوانید تغییر شکل داده به قالبی دیگر را بررسی کنید
- largest-series-product: که در آن میتوانید روشهای کارآمد جستوجوی الگو در رشتهای از ارقام را تمرین کنید
- saddle-points: برای بررسی کار با آرایهها/ماتریسهای چندبعدی
- sum-of-multiples: برای تمرین فیلتر کردن و جمع زدن دنبالهای از اعداد
- word-count: تبدیل یک رشته به کلمات و شمارش آنها
یادآوری میکنم که علاوه بر نشان Analytical April، یک نشان یکسالهی #12in23 هم هست که با حل تمرینهای ویژهی مختلف در هر زمانی از سال به دست میآید. پس برای گرفتن آن نشان، باید آن ۵ تمرین را در Python، R یا Julia در طول امسال حل کنید! فهرست کامل تمرینها در یک پست فروم است که از صفحهی Analytical April لینک شده است.
در پایان، پیش از آنکه به زبانها بپردازیم، یادآوری میکنم که در ماه مارس سرور جدید Discord خودمان را راهاندازی کردیم. فعالیتهای سرگرمکنندهی زیادی آنجا بوده، پس حتماً سر بزنید. لینکش در توضیحات پایین است!
خب، برویم سراغ زبانها. یک مرور سریع از هر زبان میکنیم و بعد به ویژگیها و موارد استفادهشان میپردازیم. با Python شروع کنیم.
Python
- توسط Guido van Rossum در اواخر دههی ۱۹۸۰ به عنوان جانشین زبان برنامهنویسی ABC طراحی و توسعه یافت. اولین بار در سال ۱۹۹۱ منتشر شد.
- در هلند، در Centrum Wiskunde & Informatica (CWI) توسعه یافت (که به خاطر جایی که Edsger Dijkstra بیشتر کارهایش را آنجا انجام داد معروف است)، یک آزمایشگاه تحقیقاتی دولتی.
- Guido با C و اسکریپتهای shell برنامهنویسی میکرد، ولی هر دو معایبی داشتند. هدف Python به دست آوردن بهترینهای هر دو دنیا، بدون معایبشان است.
- توسط Python Software Foundation اداره میشود و تغییرات زبان از طریق Python Enhancement Proposals (PEPs) انجام میشود (شبیه RFCها)
R
- توسط Ross Ihaka و Robert Gentleman در دانشگاه اوکلند ساخته شد. R را میتوان پیادهسازی متفاوتی از زبان S دانست (با تفاوتهای نسبتاً جزئی)، که S-plus، پیادهسازی تجاری (غیرباز) S، جانشین آن شد. هرچند R بیشتر نحوهی نگارشش را با S مشترک است، معناشناسیاش از Scheme الهام گرفته است
- هدف: ساختن زبانی که برای محاسبات آماری و گرافیک مناسبتر و از نرمافزارهای مشابهی که دانشمندان کامپیوتر طراحی کردهاند آسانتر باشد
Julia
- توسط Jeff Bezanson، Stefan Karpinski، Viral B. Shah و Alan Edelman بهصورت باز توسعه یافت و اکنون بیش از هزار مشارکتکننده دارد
- هدف: ساختن زبانی آزاد و سطحبالا که سرعت C، پویایی Ruby، فرابرنامهنویسی LISP، تواناییهای همهکارهی Python، پشتیبانی آماری R، پشتیبانی جبر خطی MATLAB و قدرت پردازش رشتهی Perl را داشته باشد و در همان حال از اجرای موازی انبوه پشتیبانی کند
- برای محاسبات علمی عالی است، ولی زبانی همهکاره هم هست (framework Genie برای وباپلیکیشنها)
مثل خیلی از زبانها، هر سهی آنها از دل نارضایتی ساخته شدند :)
خب، عالی. از نظر موارد استفاده، هر کدام از این زبانها را چه زمانی بهجای بقیه به کار میبرید؟
Python
- زبانی واقعاً همهکاره (وبسایتها، اسکریپتها، محاسبات علمی)
- برای هدفهای مختلف زیادی به کار میرود: AI (TensorFlow)، اسکریپتهای محاسبات علمی (NumPy)، وبسایتها (Django)، سیستمهای توکار (MicroPython)، ارتباط با سختافزار (مثلاً Raspberry Pi)، بازیها (EVE Online) و Python حتی به مریخ هم رفت
- برای یادگیری برنامهنویسی عالی است: منابع فراوان و جامعهای بزرگ. راهنماییهای زیادی دربارهی نوشتن code پایتونیک وجود دارد (یعنی چطور code اصطلاحی Python بنویسیم، نمونهها) که «Explicit is better than implicit» و «Readability counts» از جملهی آنهاست. روی خیلی از سیستمعاملها بهصورت پیشفرض نصب است
- یکی از پرکاربردترین زبانها در حال حاضر، پس مستندات، کتابخانهها و جامعهای بزرگ دارد
R
- R در جاهای بسیار متنوعی به کار میرود: پژوهشگران برای تحلیل دادههای آزمایشها، دانشگاهها برای آموزش آمار و تحلیل داده، بخش مالی چون آمار نقشی کلیدی دارد (مثلاً در بیمه)، و همچنین خردهفروشی (Amazon از R برای تحلیل داده استفاده میکند) و تولید (John Deere تخمین میزند چند قطعهی یدکی تولید کند)، سازمان ملی هواشناسی برای پیشبینی هوا و بلایا، روزنامهنگاری داده (تحلیل دادههای دنیای واقعی و معنادار کردنشان، اغلب با مصورسازی)، و در حوزهی سلامت بسیار استفاده میشود، مثلاً تعیین ایمنی یک دارو بر اساس آزمایشهای پیشبالینی
Julia:
- برای محاسبات علمی، دادهکاوی، یادگیری ماشین، جبر خطی و رایانش توزیعشده عالی است. نمادگذاریاش شبیه نمادهای ریاضی به نظر میرسد، بنابراین تبدیل معادله به code نسبتاً آسان است
- رایانش توزیعشده: کارها (یعنی همروالها) و کانالها امکان اجرای code بهصورت موازی و در ارتباط با یکدیگر را میدهند، پشتیبانی از چندفرایندی با انتقال پیام (برای رایانش با کارایی بالا عالی است)
- در پروژهی Celeste به کار رفته است (ابررایانهای که code Julia را برای تحلیل ۱۷۸ ترابایت دادهی نجومی اجرا میکند) (در نتیجه Julia را وارد باشگاه «پتافلاپ» میکند، باشگاهی که در آن زمان فقط C، C++ و Fortran عضو آن بودند. Julia اولین زبان پویا بود، با یک کوادریلیون محاسبهی ممیز شناور در ثانیه، یعنی ۱ و بعد از آن ۱۵ صفر)، در Clima (اتحاد مدلسازی اقلیم) افرادی از Caltech، MIT و آزمایشگاه پیشرانش جت ناسا یک مدل پیشبینی اقلیم توسعه میدهند، CERN، ASML
و از دید برنامهنویسی، چه تفاوتهایی دارند؟ تابعیاند، شیءگرا، یا چیز دیگری؟
Python:
- پویا و با نوعبندی قوی
- چندپارادایمی: دستوری، تابعی، ولی در واقع زبانی شیءگراست (همهچیز یک شیء است)
- مفسر پیشفرض، CPython، به bytecode کامپایل میکند و بعد آن bytecode در یک ماشین مجازی تفسیر میشود. PyPy جایگزینی برای CPython است که در لحظه به machine code کامپایل میکند
R:
- پویا و با نوعبندی قوی
- چندپارادایمی، هستهای تابعی دارد ولی از سبکهای رویهای و شیءگرا هم پشتیبانی میکند
Julia:
- پویا و با نوعبندی قوی، در لحظه کامپایل میشود
- چندپارادایمی: دستوری، شیءگرا (سربارگذاری از طریق «اعزام چندگانه»)، تابعی (توابع مرتبهبالا، اعمال جزئی، عملگر pipe)
- code در زمان اجرا، بهصورت در لحظه و از پیش کامپایل میشود
و اگر همچنان از دید برنامهنویسی نگاه کنیم، آیا هیچکدام از این زبانها ویژگی برجستهی خاصی دارند؟
Python:
- نحوهی نگارش دلپذیر: حساسیت به فاصلهها دیدن دامنه را آسان میکند. code معمولاً خواندنش آسان است، مثلاً شرطهای «منطقی» خوانا برای انسان (
and/or) - بیانگر: با code نسبتاً کم کارهای زیادی انجام میدهد (list comprehension، generator و decorator)
- مجموعهی عظیمی از کتابخانهها برای اهداف گوناگون
- همانطور که پیشتر گفته شد، واقعاً زبانی همهکاره است، چون میتوان در موقعیتهای بسیار متنوعی از آن استفاده کرد
Julia
- اعزام چندگانه. تصمیم میگیرد کدام تابع فراخوانی شود، بر اساس نوع همهی آرگومانها (مثل سربارگذاری تابع)
- پویا ولی با کارایی عالی. کارایی Julia میتواند با Fortran رقابت کند و به C نزدیک شود. code «معمولی» اغلب کاراست (نیازی به ترفندهای عجیب نیست، و در واقع تشویق میشوید توابع کوچکتر بنویسید). کتابخانههایی برای پشتیبانی از اجرای code روی واحد پردازش گرافیکی
- رایانش توزیعشده: کارها (یعنی همروالها) و کانالها امکان اجرای code بهصورت موازی و در ارتباط با یکدیگر را میدهند، پشتیبانی از چندفرایندی با انتقال پیام (برای رایانش با کارایی بالا عالی است)
- برای محاسبات علمی، دادهکاوی، یادگیری ماشین، جبر خطی و رایانش توزیعشده عالی است. نمادگذاریاش شبیه نمادهای ریاضی به نظر میرسد، بنابراین تبدیل معادله به code نسبتاً آسان است
R:
- نوعهای دادهی انعطافپذیر: بردار نوع اصلی است، حتی مقادیر اسکالر هم بردارند. بردارها میتوانند فرادادهای همراه داشته باشند (مثلاً اسم عناصر آن). لیستها ناهمگوناند (میتوانند عناصری با نوعهای مختلف داشته باشند). نوع ویژهی دیتافریم برای مجموعهای از بردارها (همه با طول یکسان).
- عملیات برداری امکان بهروزرسانی مختصر، کارا و خوانای بردارها را فراهم میکند
- R مجموعهای یکپارچه از امکانات نرمافزاری برای دستکاری داده، محاسبه و نمایش گرافیکی است. کاوش، مصورسازی و دستکاری آسان دادهها با RStudio. برای دادهکاوی عالی است
- جامعهای عالی، صمیمی و متنوع. R for Data Science Online Learning Community جامعهای از یادگیرندگان R در همهی سطوح مهارتی است که با هم برای بهبود مهارتهایشان کار میکنند. یک گروه Slack باز وجود دارد که اعضا میتوانند در آن با هم در تماس بمانند و در حل مشکلات به هم کمک کنند.
اگر کسی مطمئن نیست در آوریل کدام را امتحان کند، توصیهتان برای تصمیمگیری چیست؟
مثل همهچیز در فناوری اطلاعات: بستگی دارد! در این مورد، به نظر من بیشتر به اهدافتان و تجربهی شخصیتان بستگی دارد.
اگر نسبتاً تازهکار هستید، به AI یا یادگیری ماشین علاقه دارید، یا میخواهید زبانی یاد بگیرید که بتوانید برای کارهای مختلفی از آن استفاده کنید، احتمالاً توصیه میکنم با Python شروع کنید: تعداد منابع موجود برای Python غولآسا است و شامل دورههای آنلاین رایگان زیادی میشود Python همهجا در AI و یادگیری ماشین به کار میرود از Python میتوان برای هدفهای بسیار زیادی استفاده کرد مسیر Python حالت یادگیری دارد، که میتواند به شما کمک کند مفاهیم اصلی زبان را به شکلی سرگرمکننده یاد بگیرید
اگر به کار آماری علاقه دارید، میخواهید دادهها را کاوش و مصورسازی کنید، یا کنجکاوید روش متفاوتی برای کار با دادهها را ببینید، زبان R گزینهی عالیای است: نوعهای داده در R بر پایهی مجموعههایی از داده (بردارها/لیستها) بنا شدهاند و عملیات را میتوان بهسادگی روی مجموعهها اعمال کرد (نیازی به «حلقه» نیست) محیط توسعهی RStudio برای کاوش و مصورسازی دادهها عالی است R از تحلیل آماری پشتیبانی عالیای دارد R رسم آسان نمودار دادهها را ممکن میکند
اگر به محاسبات علمی علاقه دارید، میخواهید code را بهصورت همروند اجرا کنید، واقعاً برایتان کارایی مهم است، یا میخواهید زبانی مدرن و ظریف یاد بگیرید که چیزی متفاوت از بیشتر زبانهای دیگر ارائه میدهد، Julia را توصیه میکنم:
- اعزام چندگانه برای خیلیها تازه است و بهشدت قدرتمند
- Julia برای محاسبات علمی عالی است
- سیستم نوع Julia انعطافپذیر و بیانگر است
- کارایی Julia عالی است
- Julia برای اجرای همروند عالی است
البته اگر وقت دارید، توصیه میکنم هر سه را امتحان کنید! تا امتحان نکنید، واقعاً نمیدانید از کدام زبان خوشتان میآید.