প্রোগ্রামিং ভাষা

প্রোগ্রামিং ভাষা (ইংরেজি ভাষায়: programming language) এমন এক ধরনের কৃত্রিম ভাষা যা কোন যন্ত্রের, প্রধানত কম্পিউটারের আচরণ নিয়ন্ত্রণ করার জন্য ব্যবহার করা হয়। মানুষের মুখের ভাষাগুলোর মতোই প্রোগ্রামিং ভাষাগুলিরও নিজস্ব ব্যাকরণ রয়েছে।

জাভা প্রোগ্রামিং ভাষাতে লিখিত একটি সোর্স কোড। এটি কম্পাইল হবার পরে জাভা ভার্চুয়াল মেশিন দ্বারা রান হয়ে স্ট্যান্ডার্ড আউটপুট ডিভাইসে Hello World! দেখাবে।

তথ্য সুবিন্যস্তকরণ ও প্রক্রিয়াকরণে এবং অ্যালগোরিদমসমূহ নির্ভুলভাবে প্রকাশ করতে প্রোগ্রামিং ভাষা ব্যবহার করা হয়। কিছু কিছু লেখক প্রোগ্রামিং ভাষা বলতে কেবল সেই সকল ভাষাকে বোঝান যেগুলো সম্ভাব্য সমস্ত অ্যালগোরিদম প্রকাশ করতে সক্ষম;[1] কখনো কখনো সরল ধরনের কৃত্রিম ভাষাগুলোকে প্রোগ্রামিং ভাষা না বলে কম্পিউটার ভাষা (computer language) বলা হয়।

এ পর্যন্ত বহু হাজার প্রোগ্রামিং ভাষা সৃষ্টি করা হয়েছে,[2] এবং সর্বদাই নিত্য নতুন প্রোগ্রামিং ভাষা উদ্ভাবিত হয়ে চলেছে।

সংজ্ঞা

প্রোগ্রামিং ভাষার বিভিন্ন বৈশিষ্ট্যের ওপর ভিত্তি করে এর সংজ্ঞা দেয়া যায়:

  • কাজ (Function): প্রোগ্রামিং ভাষা হচ্ছে এক ধরনের ভাষা যা দিয়ে কম্পিউটার প্রোগ্রাম লেখা যায়, এবং এই প্রোগ্রামগুলোর সাহায্যে কম্পিউটারকে কোন গণনামূলক কাজ করার নির্দেশ দেয়া যায়,[3] এবং সম্ভব হলে কম্পিউটারের বাইরের যন্ত্রাংশ যেমন প্রিন্টার, রোবট,[4] ইত্যাদি নিয়ন্ত্রণ করা যায়।
  • লক্ষ্য (Target): প্রোগ্রামিং ভাষাগুলো থেকে স্বাভাবিক ভাষাগুলোর মধ্যে পার্থক্য হচ্ছে স্বাভাবিক মুখের ভাষা কেবল মানুষে-মানুষে যোগাযোগের জন্য ব্যবহৃত হয়, অন্যদিকে প্রোগ্রামিং ভাষাগুলোর মানুষকে যন্ত্রের কাছে আদেশ পৌঁছে দিতে সাহায্য করে। কিছু প্রোগ্রামিং ভাষা এক যন্ত্রকে আরেক যন্ত্রের সাথে যোগাযোগে সাহায্য করে। যেমন কিছু প্রোগ্রাম পোস্টস্ক্রিপ্ট প্রোগ্রাম তৈরির মাধ্যমে প্রিন্টার বা ডিসপ্লে নিয়ন্ত্রণ করতে পারে।
  • সংগঠন (Constructs): প্রোগ্রামিং ভাষায় সাধারণত কিছু সংগঠন থাকে যেগুলো দিয়ে বিভিন্ন উপাত্ত কাঠামো (data structure) সংজ্ঞায়িত করা হয় কিংবা নির্দেশ পালনের প্রবাহ বা ধারা নিয়ন্ত্রণ করা হয়।
  • প্রকাশক্ষমতা (Expressive power): গণনা তত্ত্বে (theory of computation) প্রোগ্রামিং ভাষাসমূহকে তারা কী ধরনের গণনা (computation) প্রকাশ করতে পারে, তার ওপর ভিত্তি করে শ্রেণীকরণ করা হয় (চম্‌স্কি অনুক্রম দেখুন)। সমস্ত টুরিং-সম্পূর্ণ ভাষাগুলো একই অ্যালগোরিদমের সেট বাস্তবায়ন করতে পারে। টুরিং-সম্পূর্ণ না হলেও কিছু ভাষাকে প্রায়ই প্রোগ্রামিং ভাষা বলা হয়, যেমন - অ্যানসাই/আইএসও এসকিউএল এবং চ্যারিটি[5][6]

উদ্দেশ্য

ইনসেট টোকেনাইজেশন সহ পাইথন কোডের পার্স ট্রি

প্রোগ্রামিং ভাষাগুলো কম্পিউটারকে নির্দেশ দেওয়ার জন্য ব্যবহৃত হয়। সে কারণে মানুষের মুখের ভাষা ও অন্যান্য অভিব্যক্তি থেকে এই ভাষাগুলোর প্রকৃতি আলাদা। প্রোগ্রামিং ভাষাতে সম্পূর্ণতা ও নির্ভুলতার মূল্য দেয়া হয়। স্বাভাবিক ভাষায় কথা বলে বা লেখার মানুষেরা একই শব্দের বহু অর্থ করতে পারেন এবং ছোটখাট ভুল করতে পারেন, কিন্তু তাদের মনের কথা প্রকাশ এতে তেমন ব্যাহত হয় না। অন্যদিকে, কম্পিউটার কেবল তা-ই পালন করে যা তাকে নির্দেশ দেয়া হয়, এবং কম্পিউটারের পক্ষে প্রোগ্রামার আসলেই কোন্‌ নির্দেশ দিতে চেয়েছিলেন তা বুঝতে পারা সম্ভব নয়। কোন প্রোগ্রামার প্রোগ্রামিং ভাষার সংজ্ঞা (language definition), প্রোগ্রাম, এবং প্রোগ্রামের ইনপুট – এই তিনের সমন্বয়ে সম্পূর্নরূপে নির্দেশ করে দেন যে প্রোগ্রামটি চালালে কী ঘটবে।

অনেক প্রোগ্রামিং ভাষা একেবারে শূন্য থেকে নকশা করা হয়েছে, তারপর এগুলোতে প্রয়োজন অনুসারে পরিবর্তন আনা হয়েছে, অন্য প্রোগ্রামিং ভাষার সাথে এদের সম্মিলন ঘটানো হয়েছে, এবং পরিশেষে এগুলো বাস্তব ব্যবহার থেকে পরিত্যক্ত হয়েছে। একটি “সার্বজনীন” কম্পিউটার ভাষা তৈরি করার অনেক চেষ্টা করা হয়েছে, যে ভাষা হবে যেকোন উদ্দেশ্যে ব্যবহারযোগ্য, কিন্তু কোন চেষ্টাই সফল হয়নি।[7] কাজের প্রকৃতির বৈচিত্র‌্যের কারণেই বিভিন্ন বিচিত্র কম্পিউটার ভাষা উদ্ভাবিত হয়েছে:

  • শখের প্রোগ্রাম-লেখকেরা ছোট ছোট স্ক্রিপ্ট আকারের প্রোগ্রাম লেখেন, আবার শত শত প্রোগ্রাম-লেখক মিলে বিশাল ব্যবস্থা গড়ে তোলেন।
  • প্রোগ্রাম-লেখকদের দক্ষতা তাদের পছন্দের প্রোগ্রামিং ভাষা কী হবে তা নির্ধারণ করে। নবিশ প্রোগ্রাম লেখক চান সরলতা, অন্যদিকে প্রতিষ্ঠিত প্রোগ্রাম-লেখকেরা জটিল ভাষাতে কাজ করতে অস্বাচ্ছন্দ্য বোধ করেন না।
  • মাইক্রোকন্ট্রোলার থেকে শুরু করে সুপার কম্পিউটার – বিভিন্ন গতি, আকার ও জটিলতার যন্ত্রের ওপর নির্ভর করে প্রোগ্রাম কী ভাষায় লেখা হবে।
  • কিছু প্রোগ্রাম একবার লেখা হয় ও যুগ যুগ ধরে পাল্টানো লাগে না। আবার কিছু প্রোগ্রামে প্রতিনিয়ত পরিবর্তন সাধন করতে হয়।
  • প্রোগ্রাম-লেখকদের পছন্দেরও ব্যাপার আছে। প্রোগ্রামাররা সাধারণত একটি নির্দিষ্ট ভাষাতে তাদের সমস্যাগুলো নিয়ে চিন্তা করতে ও আলোচনা করতে পছন্দ করেন।

প্রতিনিয়তই প্রোগ্রামিং ভাষাগুলোর উন্নতিসাধন করার চেষ্টা চলে এবং প্রায়ক্ষেত্রেই লক্ষ্য থাকে ভাষাতে উচ্চস্তরের বিমূর্তন ব্যবহার করে সমস্যা সমাধানের ক্ষমতা বাড়ানো। একেবারে শুরুর দিককার প্রোগ্রামিং ভাষাগুলো কম্পিউটারের হার্ডওয়্যারের সাথে খুবই ঘনিষ্ঠভাবে জড়িত ছিল। নতুন প্রোগ্রামিং ভাষাগুলোতে অনেক নতুন ফিচার বা বৈশিষ্ট্য যোগ করা হয় যাতে প্রোগ্রামারদের কীভাবে তাদের প্রোগ্রামের হার্ডওয়্যার নির্দেশে রূপান্তরিত হবে তা নিয়ে চিন্তা করতে না হয়। ফলে প্রোগ্রামাররা এখন একই সময়ে আগের চেয়ে অনেক বেশি প্রোগ্রাম লিখতে পারেন।[8]

প্রোগ্রামিং-এর জন্য বিশেষায়িত ভাষার ব্যবহার দূর করে মানুষের স্বাভাবিক ভাষা ব্যবহারের জন্য স্বাভাবিক ভাষা প্রসেসরের ব্যবহার অনেকে প্রস্তাব করেছেন। কিন্তু এটা বাস্তবায়ন করা কঠিন। আর এর সুফল নিয়েও বিতর্ক আছে। এট্‌সখার ডেইক্‌স্ট্রা মনে করতেন বিধিবদ্ধ ভাষার অর্থহীন বর্ণসমূহ দূর করা অত্যন্ত জরুরি। তিনি স্বাভাবিক ভাষায় প্রোগ্রাম লেখাকে বোকামি বলে মনে করতেন। [9] অ্যালান পেরলিস-ও এ ব্যাপারে নেতিবাচক অবস্থান নেন। [10]

উপাদানসমূহ

সিনট্যাক্স

প্রোগ্রামিং ভাষার বই

কোন প্রোগ্রামিং ভাষার বাইরের রূপকে তার সিনট্যাক্স বলা হয়। বেশির ভাগ প্রোগ্রামিং ভাষাই সম্পূর্ণ টেক্সট-ভিত্তিক। এগুলি শব্দ, সংখ্যা ও বিরামচিহ্নবিশিষ্ট টেক্সট ব্যবহার করে, অনেকটা স্বাভাবিক ভাষাগুলির মতই। তবে কিছু কিছু প্রোগ্রামিং ভাষা আছে যেগুলি চিত্রভিত্তিক। এগুলি বিভিন্ন প্রতীকের মধ্যকার অবস্থানগত সম্পর্ক কাজে লাগিয়ে প্রোগ্রাম লিখতে সহায়তা করে।

কোন প্রোগ্রামিং ভাষার প্রতীকগুলি কী কী উপায়ে একত্রিত হয়ে সিনট্যাক্সগতভাবে সঠিক প্রোগ্রাম তৈরি করতে পারে, ভাষাটির সিনট্যাক্সে তার বিবরণ থাকে। আর কোন প্রতীকসমষ্টির অর্থ কী হবে, তা নির্ধারণ করে ভাষাটির সেমান্টিক্‌স।

প্রোগ্রামিং ভাষার সিনট্যাক্স সাধারণত নিয়মিত এক্সপ্রেশন (regular expression) ([[আভিধানিক বিশ্লেষণ|আভিধানিক গঠনের জন্য) এবং বাকাস-নাউর রূপ (Backus-Naur Form) (ব্যাকরণিক গঠনের জন্য) এই দুইয়ের সমন্বয়ে তৈরি করা হয়।

নিচে লিস্পের ওপর ভিত্তি করে লেখা একটি সরল ব্যাকরণ দেয়া হল:

expression ::= atom | list
atom ::= number | symbol
number ::= [+-]?['0'-'9']+
symbol ::= ['A'-'Z''a'-'z'].*
list ::= '(' expression* ')'

উপরের ব্যাকরণটি নিচের জিনিসগুলিকে সংজ্ঞায়িত করেছে:

  • একটি expression হয় একটি atom অথবা একটি list;
  • একটি atom হয় একটি number অথবা একটি symbol;
  • একটি number হচ্ছে এক বা একাধিক দশমিক অঙ্কের অবিভক্ত ধারা, এবং ধারাটির আগে ঐচ্ছিকভাবে যোগ বা বিয়োগ চিহ্ন বসানো যেতে পারে;
  • একটি symbol হচ্ছে একটি ইংরেজি বর্ণ এবং তাকে অনুসরণকারী শূন্য বা তার বেশি যেকোন সংখ্যক ক্যারেক্টার (ফাঁকাস্থান ব্যতীত); এবং
  • একটি list হচ্ছে একজোড়া বন্ধনীর মধ্যে শূন্য বা তার বেশি সংখ্যক expression

এই ব্যাকরণ সঠিকভাবে অনুসরণকারী কিছু টোকেনের উদাহরণ: '12345', '()', '(a b c232 (1))'

সিনট্যাক্সগতভাবে সঠিক প্রোগ্রাম মাত্রেই সেমান্টিক্‌স বা অর্থগতভাবে সঠিক হবে, তা নয়। অনেক সিনট্যাক্সগতভাবে সঠিক প্রোগ্রাম তাই অনুবাদ বা নির্বাহ করার সময় ত্রুটির সৃষ্টি করতে পারে। কোন কোন ক্ষেত্রে এরকম প্রোগ্রাম অসংজ্ঞায়ির আচরণ (undefined behavior) প্রদর্শন করতে পারে। আবার কোন প্রোগ্রাম প্রোগ্রামিং ভাষার সমস্ত নিয়মকানুন মেনে চললেও এটি প্রোগ্রামার যা করতে চেয়েছিলেন সেই অর্থে না-ও বাস্তবায়িত হতে পারে।

মানুষের মুখের স্বাভাবিক ভাষাতেও এর উদাহরণ মেলে। কোন ব্যাকরণগতভাবে শুদ্ধ বাক্য অর্থহীন হতে পারে, যেমন:

  • "Colorless green ideas sleep furiously." - এই ইংরেজি বাক্যটি ব্যাকরণগতভাবে শুদ্ধ কিন্তু এর কোন সর্বজনগৃহীত অর্থ নেই।
  • "John is a married bachelor." - এই বাক্যটি ব্যাকরণগতভাবে শুদ্ধ কিন্তু এমন একটি অর্থ প্রকাশ করে যা সত্য নয়।

নিচের সি প্রোগ্রামিং ভাষায় লেখা কোডটি সিনট্যাক্সগতভাবে শুদ্ধ, কিন্তু এটি এমন একটি অপারেশন সম্পাদন করে যা সেমান্টিক্‌সগতভাবে বা অর্থগতভাবে সংজ্ঞায়িত নয়। (যেহেতু p একটি নাল পয়েন্টার, p->real এবং p->im অপারেশনগুলি অর্থহীন):

complex *p = NULL;
complex abs_p = sqrt (p->real * p->real + p->im * p->im);

টাইপ ব্যবস্থা

যেকোন প্রোগ্রামিং ভাষা মান (values) ও এক্সপ্রেশনগুলিকে বিভিন্ন “টাইপে” শ্রেণিকরণ করে। এই শ্রেণিকরণ, কীভাবে টাইপগুলি ব্যবহার করা যাবে এবং টাইপগুলির একে অপরের সাথে সম্পর্ক কী, তা সংজ্ঞায়িত থাকে প্রোগ্রামিং ভাষাটির টাইপ ব্যবস্থায়। ভাষাটিতে কী ধরনের উপাত্ত কাঠামো ব্যবহার করা যাবে, টাইপ ব্যবস্থায় মূলত তারই বিবরণ থাকে। বিধিগত গণিত ব্যবহার করে টাইপ ব্যবস্থাগুলি ডিজাইন ও গবেষণা “টাইপ তত্ত্বের” আলোচ্য।

আধুনিক ডিজিটাল কম্পিউটারের ভেতরে সমস্ত উপাত্তই শূন্য বা এক আকারে রক্ষিত থাকে (দ্বিমিক সংখ্যা ব্যবস্থা দেখুন)। এই উপাত্ততে বাস্তব বিশ্বের নানা তথ্য যেমন নাম, ব্যাংক অ্যাকাউন্ট, পরিমাপ, ইত্যাদি প্রকাশ পেতে পারে। প্রোগ্রামিং ভাষা নিম্নস্তরের দ্বিমিক উপাত্তকে এই উচ্চ-স্তরের তথ্যের ধারণায় বাস্তবায়ন করে উপাত্ত টাইপের সাহায্য নিয়ে। এছাড়া আরও কিছু বিমূর্ত টাইপ আছে যেগুলি প্রোগ্রামের নিরাপত্তার সুবিধার্থে কিংবা প্রোগ্রামারকে অর্থহীন বিবৃতির ব্যাপারে সাবধান করে দেয়ার জন্য ব্যবহৃত হয়।

প্রোগ্রামিং ভাষাগুলিকে তাদের টাইপ ব্যবস্থাগুলির ওপর ভিত্তি করে শ্রেণীবিভাগ করা যায়।

টাইপকৃত বনাম অ-টাইপকৃত ভাষা

কোন প্রোগ্রামিং ভাষার একটি উপাত্ত টাইপের জন্য সংজ্ঞায়িত অপারেশনগুলি যখন অন্য একটি উপাত্ত টাইপের ওপর প্রয়োগ করা যায় না, তখন সেই ভাষাটিকে “টাইপকৃত ভাষা” বলা হয়। [11] উদাহরণস্বরূপ, "this text between the quotes" একটি স্ট্রিং। বেশির ভাগ প্রোগ্রামিং ভাষায় স্ট্রিং-কে কোন সংখ্যা দিয়ে ভাগ করা অর্থহীন। তাই বেশির ভাগ ভাষাতে কোন প্রোগ্রামকে এই ধরনের অপারেশন সম্পাদন করতে বাধা দেয়া হয়। কিছু কিছু ভাষায় এই অর্থহীন অপারেশনটি প্রোগ্রামটি কম্পাইল করার সময় ধরা হয়; একে বলা হয় “স্থির টাইপ পরীক্ষা” (static type checking), এবং কম্পাইলার অপারেশনটি প্রত্যাখ্যান করে। আবার অন্য কিছু ভাষায় এই ধরনের অপারেশন যখন প্রোগ্রামটি চালানো হয় বা “রান” করা হয়, তখন ধরা হয়; একে বলা হয় “চলমান টাইপ পরীক্ষা” (dynamic type checking), এবং এতে “রান-টাইম” এক্সেপশন সৃষ্টি হয়।

নিম্নস্তরের ভাষা

নিম্নস্তরের ভাষা(low level language) সরাসরি কম্পিউটারের প্রধান মেমোরির উপর কাজ করতে পারে। অ্যাসেম্বলি ভাষা একটি নিম্নস্তরের ভাষা,এ ভাষায় সরাসরি কম্পিউটারের রেজিস্টারকে নিয়ন্ত্রণ করে কাজ করতে হয়। এ ভাষাগুলো হার্ডওয়্যারের উপর নির্ভরশীল,তাই এক কম্পিউটারে অ্যাসেম্বলি ভাষায় লেখা প্রোগ্রাম অন্য কম্পিউটারে কাজ নাও করতে পারে।

সংক্ষিপ্ত তালিকা

  1. পিএইচপি
  2. জাভা
  3. পাইথন
  4. সি
  5. সি++
  6. সি শার্প
  7. না
  8. গো
  9. রুবি
  10. জুলিয়া

তথ্যসূত্র

  1. গণিতের ভাষায় যাকে টুরিং-সম্পূর্ণ বলা হয়৷ MacLennan, Bruce J. (১৯৮৭)। Principles of Programming Languages। Oxford University Press। পৃষ্ঠা 1। আইএসবিএন ০-১৯-৫১১৩০৬-৩।
  2. মে, ২০০৬-এ The Encyclopedia of Computer Languages ওয়েব্যাক মেশিনে আর্কাইভকৃত ২০ ফেব্রুয়ারি ২০১১ তারিখে-এ ৮৫১২টি কম্পিউটার ভাষার উল্লেখ ছিল।
  3. ACM SIGPLAN (২০০৩)। "Bylaws of the Special Interest Group on Programming Languages of the Association for Computing Machinery"। সংগ্রহের তারিখ ২০০৬-০৬-১৯, The scope of SIGPLAN is the theory, design, implementation, description, and application of computer programming languages - languages that permit the specification of a variety of different computations, thereby providing the user with significant control (immediate or delayed) over the computer's operation.
  4. Dean, Tom (২০০২)। "Programming Robots"Building Intelligent Robots। Brown University Department of Computer Science। সংগ্রহের তারিখ ২০০৬-০৯-২৩
  5. Digital Equipment Corporation। "Information Technology - Database Language SQL (Proposed revised text of DIS 9075)"ISO/IEC 9075:1992, Database Language SQL। সংগ্রহের তারিখ June 29 অজানা প্যারামিটার |accessyear= উপেক্ষা করা হয়েছে (|access-date= ব্যবহারের পরামর্শ দেয়া হচ্ছে) (সাহায্য); এখানে তারিখের মান পরীক্ষা করুন: |সংগ্রহের-তারিখ= (সাহায্য)
  6. The Charity Development Group (১৯৯৬)। "The CHARITY Home Page"। সংগ্রহের তারিখ ২০০৬-০৬-২৯ অজানা প্যারামিটার |month= উপেক্ষা করা হয়েছে (সাহায্য), Charity is a categorical programming language..., All Charity computations terminate.
  7. IBM in first publishing PL/I, for example, rather ambitiously titled its manual The universal programming language PL/I (IBM Library; 1966). The title reflected IBM's goals for unlimited subsetting capability: PL/I is designed in such a way that one can isolate subsets from it satisfying the requirements of particular applications. ("Encyclopaedia of Mathematics » P  » PL/I"SpringerLink। সংগ্রহের তারিখ June 29 অজানা প্যারামিটার |accessyear= উপেক্ষা করা হয়েছে (|access-date= ব্যবহারের পরামর্শ দেয়া হচ্ছে) (সাহায্য); এখানে তারিখের মান পরীক্ষা করুন: |সংগ্রহের-তারিখ= (সাহায্য)). Ada and UNCOL had similar early goals.
  8. Frederick P. Brooks, Jr.: The Mythical Man-Month, Addison-Wesley, 1982, pp. 93-94
  9. Dijkstra, Edsger W. On the foolishness of "natural language programming." EWD667.
  10. Perlis, Alan, Epigrams on Programming ওয়েব্যাক মেশিনে আর্কাইভকৃত ১৭ জানুয়ারি ১৯৯৯ তারিখে. SIGPLAN Notices Vol. 17, No. 9, September 1982, pp. 7-13
  11. Andrew Cooke। "An Introduction to Programming Languages"। ২১ মে ২০০৮ তারিখে মূল থেকে আর্কাইভ করা। সংগ্রহের তারিখ June 30 অজানা প্যারামিটার |accessyear= উপেক্ষা করা হয়েছে (|access-date= ব্যবহারের পরামর্শ দেয়া হচ্ছে) (সাহায্য); এখানে তারিখের মান পরীক্ষা করুন: |সংগ্রহের-তারিখ= (সাহায্য)

আরও পড়ুন

  • David Gelernter, Suresh Jagannathan: Programming Linguistics, The MIT Press 1990.
  • Samuel N. Kamin: Programming Languages: An Interpreter-Based Approach, Addison-Wesley 1990.
  • Shriram Krishnamurthi: Programming Languages: Application and Interpretation, অনলাইন সংস্করণ
  • Burce J. MacLennan: Principles of Programming Languages, Harcourt Brace Jovanovich 1987.
  • John C. Mitchell: Concepts in Programming Languages, Cambridge University Press 2002.
  • Benjamin C. Pierce: Types and Programming Languages, The MIT Press 2002.
  • Ravi Sethi: Programming Languages: Concepts and Constructs, 2nd ed., Addison-Wesley 1996.
  • Richard L. Wexelblat (ed.): History of Programming Languages, Academic Press 1981.

বহিঃসংযোগ

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.