PL/I (skraćenica za "Programming Language One" — izgovor: pi-el-van) je proceduralni, imperativniprogramski jezik, dizajniran za naučne, inženjerske i poslovne sistemsko programirane aplikacije. Korišten je od strane raznih akademskih, komercijalnih i industrijalnih organizacija od kako je bio uveden 1960ih.
Tokom 1950-ih i ranih 1960-ih poslovni i naučni korisnici su programirali za različit računarski hardver koristeći različite programske jezike. Poslovni korisnici su prelazili sa asembleraAutocoder preko COMTRAN-a na COBOL, dok su naučni korisnici programirali preko generalnog interpretativnog programa (General Interpretative Programme - GIP), Fortran-a, ALGOL-a, GEORGE-a, i drugih programskih jezika. IBM System/360[1] (najavljen 1964. ali tek isporučen 1966.) je dizajniran kao opšta mašinska arhitektura za obje grupe korisnika, smijenjujući sve postojeće IBM arhitekture. IBM je također htio da napravi jedan programski jezik za sve korisnike. Kompanija je se nadala proširiti Fortran tako da ono uključuje sve karakteristike tražene od strane komercijalnih programera. U oktobru 1963. osnovan je komitet[2] koji je se stastojao od 3 IBM-ovca iz New Yorka i 3 člana iz SHARE grupe, sa ciljem da se predlože nova proširenja. Uz data ograničenja Fortran-a, ovaj cilj nisu uspjeli ostvariti što je rezultiralo pravljenjem “novog programskog jezika” zvanog "NPL" (New Programming Language), bazirajući se široko na ALGOL. Ovaj akronim je bio u konfliktu sa imenom nacionalne fizičke laboratorije (National Physical Laboratory) u Velikoj Britaniji te je zato bio privremeno preimenovan u MPPL (MultiPurpose Programming Language), i kasnije 1965. na PL/I (sa rimskim brojem “I”). Prva definicija PL/I-a je se pojavila u aprilu 1964.[3][4]
Primjeri
Pozdrav svijete
Hello2: proc options(main);
put list ('Pozdrav svijete!');
end Hello2;
Pretraga niza
/* Učitaj jedan red koji sadrži neki niz,
/* i onda izbaci sve slijedeće redove koji sadrže ovaj niz. */
find_strings: procedure options (main);
declare pattern character (100) varying;
declare line character (100) varying;
declare (line_no, end_file) fixed binary;
end_file = 0;
on endfile (sysin) end_file = 1;
get edit (pattern) (L);
line_no = 1;
do while (end_file = 0);
if index(line, pattern) > 0 then
put skip list (line_no, line);
line_no = line_no + 1;
get edit (line) (L);
end;
end find_strings;