Python има какво да предложи на разработчиците на Java, а езиците са интересни както в приликите им, така и в различията им. Ще се гмурнеммалко по-дълбоко и изследваме някои от по-фините технически различия.
Най-голямото сходство е техният дизайн (почти), както и неща като стандартни библиотеки.
Съществуват и големи различия. На общностно ниво Java винаги е имала един голям корпоративен спонсор. Поддръжката на Python е по-разпространена. Въпреки че и двата вида се намират в семейството езици, използвано от Алгол, използването на Python го поставя малко по-далеч от основния поток, отколкото Java, който е познат в използването на скоби.
И двата езика се компилират до байткодове, които се изпълняват на виртуални машини, въпреки че Python обикновено прави това автоматично по време на изпълнение и Java има отделна програма (javac), която го прави. Виртуалните машини до голяма степен изолират езиците от капризите на основния хардуер. Много Java виртуални машини (JVMs) имат способността да правят моментна компилация на части от байткода, независимо от платформата, което може да доведе до значителни ускорения.
Ключово различие: duck typing
Най-голямата разлика между двата езика е, че Java е статично въведен и Python е динамично написан.
Python е силно, но динамично написан. Това означава, че имената в кода са обвързани с написани обекти по време на изпълнение. Единственото условие за типа обект, за който се отнася дадено име, е, че поддържа операциите, необходими за конкретните примери на обекта в програмата. Например, може да има два вида думи Face и Car, които поддържат операция "Run", но Car също поддържа "refuel". Докато програмата използва израза "run" на обекти, няма значение дали са Личност или Кола. Това се нарича "duck typing" след израза "ако ходи като патица и говори като патица, това е патица".
Това прави Python много лесен за писане и не твърде труден за четене, но труден за анализиране. Статичното впечатление в Python е проблем. Алгоритъмът Hindley-Milner, който се използва често на функционални езици като Haskell и ML, зависи от това, например, че някои операции са ограничени до определени типове. Тези езици обикновено имат и функционални подписи, които "подреждат" алгоритъма с типовата информация за аргументите си.
В Python имената нямат силно свързване с техния тип и благодарение на въвеждането на duck typing, аргументите за функциите могат да се използват за преминаване във всеки обект, чийто интерфейс поддържа операциите, изисквани от функцията. Няма разумен начин да се определи типа аргумент в този случай, който може да бъде удобен и много прилича на това как използваме обекти в реалния свят. В реалния свят обикновено няма да ни пука, ако имам rock или hammer: и двата имат интерфейси "hit ()", които водят до подобни последствия.
Класовете в обектно-ориентираните езици са предназначени да моделират концепции, но понятията са чисто мисловни конструкции, които са по същество нагласи към конкретните неща на реалността.Един обект не трябва да бъде "определен", той просто трябва да бъде използваем, когато нещо от този тип бъде използвано. Това може да доведе до изненади, но това е по-точно отражение на категоричната плавност на човешката мисъл, отколкото твърдата йерархия, наложена от по-рестриктивни тип системи.
Недостатъкът е, че липсата на информация за типа означава, че може да е трудно да се каже какво се случва на дадено място в кода, особено когато имената са двусмислени, които те често са.
Искате да научите Java и Python? Заповядайте в Международна комоютърна академия IT STEP, за да разберете повече за нашето обучение и за това защо IT STEP е най-доброто място за вас!