디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

linq 다른언어용으로 비슷하게 만든거앱에서 작성

발명도둑잡기(118.216) 2025.11.26 18:27:08
조회 111 추천 0 댓글 2

챗지피티
LINQ와 비슷한 개념(쿼리식/함수형 컬렉션 처리)을 다른 언어에서 구현한 것들을 정리해줄게.
핵심은 “컬렉션/객체에 대해 선언적 쿼리 스타일로 변환·필터·집계”를 제공하는 기능들이다.

LINQ와 가장 유사한 기능을 가진 언어들

1) Java – Stream API

LINQ 영향 가장 크게 받은 기능

list.stream() .filter(x -> x > 10) .map(x -> x * 2) .collect(Collectors.toList());

지연 실행(Lazy)

Select/Where/GroupBy와 매우 비슷

단, 쿼리 문법은 없고 메서드 체이닝 방식

2) – Array Methods / Lodash

기본 내장 메서드

arr.filter(x => x > 10).map(x => x * 2)

Lodash도 Map/Filter/Reduce를 확장한 LINQ 느낌의 라이브러리

_.chain(arr).filter(...).map(...).value();

3) Python – List Comprehension / itertools / pandas

List Comprehension

[x*2 for x in arr if x > 10]

itertools (지연 실행)

filter(lambda x: x > 10, arr)

pandas → SQL/LINQ와 거의 동일

df[df.age > 30].groupby("city").mean()

4) Kotlin – Sequence / Collections API

list.filter { it > 10 }.map { it * 2 }

Java Stream보다 직관적

LINQ와 구조적으로 매우 유사

5) Scala – Collections / Lazy Streams

arr.filter(_ > 10).map(_ * 2)

완전 함수형 스타일로 LINQ와 상당히 가까움.

6) Rust – Iterator

arr.ㅡiter() .filter(|x| *x > 10) .map(|x| x * 2) .collect::<Vec<_>>();

지연 실행 + 체이닝 = LINQ와 매우 유사.

7) F# – Seq / List / Array modules

arr |> Seq.filter (fun x -> x > 10) |> Seq.map (fun x -> x * 2)

C#과 같은 .NET 패밀리라 LINQ와 거의 동일한 철학 공유.

8) Swift – Functional Sequence API

arr.filter { $0 > 10 }.map { $0 * 2 }

9) Ruby – Enumerable

arr.select { |x| x > 10 }.map { |x| x * 2 }

“LINQ 자체를 다른 언어로 포팅한 프로젝트”

“LINQ를 흉내 낸 라이브러리”들도 있다:

라이브러리언어특징jinqJavaLINQ 스타일 APIlinq.jsC# LINQ를 거의 그대로 구현RxJS / RxJavaJS / JavaLINQ to s + LINQ to Events 철학morelinqC#LINQ 확장linq4jJavaApache Calcite 기반, SQL 같은 쿼리 가능

결론

LINQ는 독자적인 문법(Query Syntax)까지 가진 특이한 성공 사례지만,
“컬렉션을 쿼리하듯 다루는 함수형 API”는 거의 모든 현대 언어가 제공한다.

가장 LINQ스럽다고 평가되는 언어 TOP 3

Java Stream

Kotlin Sequence

Scala Collections

필요하다면
각 언어별 LINQ 대응 표,
LINQ 스타일 DSL 만들기,
C# LINQ 기능을 다른 언어로 포팅하는 방법
도 만들어줄까?

좋아, C# LINQ처럼 동작하는 DSL(도메인 특화 언어)을 만드는 방법
*“직접 구현 가능한 최소 예제 + 확장 방식”*까지 아주 구체적으로 정리해줄게.

아래는 언어 불문 공통 설계 원리 → 예제 구현(파이썬/자바스크립트/자바 중 선택형) → 확장 패턴 순서로 설명한다.

1. LINQ DSL의 핵심 개념 4가지

LINQ는 크게 다음 4개만 구현하면 “동작하는 DSL”이 된다:

① Enumerable(Sequence) 타입

내부적으로 iterable 보관

지연 실행 또는 즉시 실행 중 선택

② 연산자 (Where, Select, GroupBy…)

함수 체이닝 지원

식(expression)을 인자로 받음

새로운 Sequence 리턴 → 불변성 유지

③ 쿼리 엔진

체인된 연산자를 순서대로 평가

Lazy evaluation을 하면 성능이 매우 비슷해짐

④ (선택) Query Syntax → Method Syntax 변환기

C#은

from x in data where x > 10 select x * 2

을 내부적으로

data.Where(x => x > 10).Select(x => x * 2)

로 바꾼다.
이건 선택 사항.

2. 최소 기능 LINQ DSL을 직접 구현하기 (언어 무관 알고리즘)

Sequence 클래스 구조

Sequence { source : iterable ops : list of operations where(func) select(func) toList() }

Lazy pipeline

각 연산을 “기계적으로” 이어붙이면 된다:

ops = [ ("where", lambda x: x > 10), ("select", lambda x: x * 2), ]

평가할 때:

for item in source: if all where(item): item = select(item) yield item

3. 완전 작동하는 실제 DSL 구현 예제

언어 하나 고르는 대신 가장 짧고 명확한 파이썬 버전을 기준으로 보여줄게.
(원하면 Java 또는 JS로도 만들어줄게.)

파이썬 LINQ DSL 구현 (Lazy)

class Query: def __init__(self, source): self.source = source self.ops = [] def where(self, func): self.ops.append(("where", func)) return self def select(self, func): self.ops.append(("select", func)) return self def __iter__(self): for item in self.source: ok = True value = item for op, fn in self.ops: if op == "where": if not fn(value): ok = False break elif op == "select": value = fn(value) if ok: yield value def toList(self): return list(iter(self))

사용법

q = Query([1,2,3,4,5,6]) \ .where(lambda x: x % 2 == 0) \ .select(lambda x: x * 10) print(q.toList()) # [20, 40, 60]

LINQ의 핵심 형태를 그대로 재현했다.

4. “쿼리 문법”까지 만들기 (선택)

C#의 LINQ Query Syntax처럼 만들고 싶다면
아래 같은 "미니 파서"를 만들면 된다.

예시 문법:

from x in data where x > 10 select x * 2

파서 아이디어:

def parse(query_string, env): # 라인별로 분해 # 변수명 / source / 조건 / 선택 식 파싱 # ast로 변환 후 Query(...) 메서드 체인으로 출력

가능한 단순 구현 예:

def linq(q, env): lines = [l.strip() for l in q.strip().split("\n")] var, src = lines[0].split()[1], env[lines[0].split()[3]] query = Query(src) for line in lines[1:]: if line.startswith("where"): expr = line[len("where "):] query = query.where(lambda x, e=expr: [...]) elif line.startswith("select"): expr = line[len("select "):] query = query.select(lambda x, e=expr: [...]) return query

사용:

dsl = """ from x in data where x % 2 == 0 select x * 10 """ print(linq(dsl, {"data": [1,2,3,4,5,6]}).toList())

5. DSL 확장 포인트

이후에는 다음 것들을 추가할 수 있다.

• Join

Cross product + 필터

• GroupBy

키→아이템 리스트 dict 만들어서 Sequence로 감쌈

• OrderBy / ThenBy

파이프라인 마지막에서 sort

• SelectMany

flatMap

• Aggregate / Sum / Min / Max

즉시 평가 함수

• Deferred vs Immediate Execution 선택

실제 LINQ와 동일한 구조 구현 가능

원하면 더 만들어줄 수 있는 것

아래 중에 원하는 걸 말해줘:

Java 스타일 Stream 기반 DSL

용 LINQ.js 직접 구현

C# LINQ 기능 30개 전부 지원하는 DSL 풀버전

Query Syntax를 미니 SQL처럼 확장

타입 안전 LINQ DSL (Kotlin/TS)

어떤 스타일로 계속 만들어줄까?


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 이제는 의미 없어진 것 같은 시상식은? 운영자 25/12/01 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
2905917 "쿠팡 IT 인력 절반 이상 중국인"…내부 폭로에 '발칵' 발명도둑잡기(211.246) 12.01 42 0
2905916 오픈AI 연구원 "고교 중퇴 후 챗GPT로 머신 러닝 배워...박사급들과 ㅇㅇ(106.102) 12.01 35 0
2905915 '일반 사무 업무' 라더니... 비밀 유지 계약서까지..? /KNN 발명도둑잡기(211.246) 12.01 34 0
2905913 호떡의 계절..❤+ [3] 따당갤로그로 이동합니다. 12.01 83 0
2905912 나 더이상 못버티겠어 퇴사해야할듯해.. [3] ㅇㅇ(211.235) 12.01 108 0
2905911 형들 이거 뭐임? [4] 프갤러(118.235) 12.01 102 0
2905910 군대는 언제감? [6] ㅇㅇ갤로그로 이동합니다. 12.01 80 0
2905909 요새 여기 저기 개인정보 털리네 [2] 류류(121.140) 12.01 59 0
2905908 안녕하세요. ㅇㅇ(118.221) 12.01 30 0
2905907 한국 프로그래머 커뮤니티 추천좀 [3] Fhiwjsjsjeje갤로그로 이동합니다. 12.01 103 0
2905905 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ [2] ♥발라당냥덩♥갤로그로 이동합니다. 12.01 60 0
2905904 리눅스 유료로 변환되누 ㅋㅋㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 12.01 79 0
2905902 미국회사 쿠팡은 한국고객 개인정보보호나 한국 노동자 인권에 관심이 없다 발명도둑잡기(39.7) 12.01 29 0
2905901 주한미군의 ‘뒤집힌 지도’와 전략적 유연성 발명도둑잡기(39.7) 12.01 35 0
2905900 남자는 애인이나 아내가 없으면 포악해진다 발명도둑잡기(118.235) 12.01 37 0
2905899 쿠팡 개인정보 유출은 중국인 개발자 소행 [4] chironpractor갤로그로 이동합니다. 12.01 94 2
2905898 개발일하면서 주식투자 공부해왔는데 [2] ㅇㅇ(116.43) 12.01 71 0
2905896 [단독] “북한 오물풍선전, 사실상 국군이 먼저 도발…아군에도 비밀이었다 발명도둑잡기(118.235) 12.01 28 0
2905895 빅테크 기업은 C++ 로 개발하냐? [2] 프갤러(59.16) 12.01 82 0
2905889 방구가 진짜 미칠듯이 나옴 [8] 개멍청한유라갤로그로 이동합니다. 12.01 85 0
2905888 혹시 DLL 인젝션 고수있음? [11] 프갤러(1.213) 12.01 145 0
2905887 아~~~~~~~~~~~ [9] 개멍청한유라갤로그로 이동합니다. 12.01 82 0
2905886 Lua script하는 친구들 많아? [10] 프갤러(1.213) 12.01 107 1
2905883 나님… 멧챠 카와이.. ❤+ [2] 따당갤로그로 이동합니다. 12.01 110 0
2905881 나의 인버스 동지들 맘고생이 많소 [4] chironpractor갤로그로 이동합니다. 12.01 74 0
2905879 컴컴.. ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 12.01 67 0
2905877 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 12.01 30 0
2905876 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 12.01 53 0
2905871 인지과학조져라 손발이시립디다갤로그로 이동합니다. 12.01 68 0
2905869 결국 jemalloc 래핑하는 걸로 타협봤어요 [1] 나르시갤로그로 이동합니다. 12.01 51 0
2905862 요즘에 AI가 나오니까 시니어 1명 주니어 다수 형태로 가는거같음 프갤러(58.76) 12.01 75 0
2905853 코로나때 국비고졸로 취업했었다면 어땟을까 ㅇㅇ(211.235) 12.01 80 0
2905845 어떤 주장을 할 때 느끼는거지만 [5] 루도그담당(58.233) 12.01 111 1
2905810 방귀 냄새를 맡는다고? 떵을 먹겟다는 소리냐? [8] 헬마스터(211.35) 12.01 180 7
2905795 개발자 연봉 왤케 내려갔냐 ㅇㅇ(117.111) 12.01 101 0
2905781 취업이 낳냐 창업이 낳냐 [3] ㅇㅇ갤로그로 이동합니다. 12.01 90 0
2905774 ai 대체드립 이거 굉장히 좋은듯 [7] 프갤러(110.8) 12.01 124 0
2905771 IT굽삐 광고가 이제 [2] 개멍청한유라갤로그로 이동합니다. 12.01 88 0
2905745 지금 신입 ㅈ된거 아니냐 [5] ㅇㅇ갤로그로 이동합니다. 11.30 171 0
2905740 파이썬 어케 실행하냐고 묻는 개발자 어케 생각함? [6] 프갤러(218.153) 11.30 135 1
2905739 IT 인력을 좀 줄일 필요는 있는 듯 [1] ㅇㅇ(114.30) 11.30 121 0
2905738 IT 배우려면 인도 기업 가라는 이유 [4] 프갤러(124.54) 11.30 147 0
2905736 12.3 계엄 그날의 시계는 돌아온다. [그날의 의미] [누군가의 길에서 넥도리아(220.74) 11.30 37 0
2905735 혹시 이제 코딩 c언어 몰라도 할수있는 정도임? [1] 흑인갤로그로 이동합니다. 11.30 121 0
2905734 큰 결심을 하려 한다. 넥도리아(220.74) 11.30 58 0
2905724 디시 클리너 돌리기 어려움?? [11] ㅇㅇ(175.214) 11.30 88 0
2905719 님들 혹시 다이어그램 같은 거 직접그림? [2] ㅇㅇ(115.140) 11.30 86 0
2905710 한달에 100km 정도 뛰는듯? [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 117 0
2905709 2000년대 머리스탈이 지금보다 낳지않냐? [4] 헬마스터갤로그로 이동합니다. 11.30 85 0
2905708 나님 슬슬 졸린.. [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.30 115 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2